【问题标题】:Querying Subdocument and Returning Matching Subdocument only仅查询子文档并返回匹配的子文档
【发布时间】:2017-07-01 19:03:47
【问题描述】:

cExample Mongo 文档

{
  "_id": ObjectId("5652e77f21b0f1f2692558a1"),
  "category": "clothing",
  "Brand": [
    {
      "name": "Adidas",
      "key": "Adidas"
    },
    {
      "name": "Reebok",
      "key": "Reebok"
    },
    {
      "name": "Puma",
      "key": "Puma"
    }
  ],
  "Color": [
    {
      "name": "Red",
      "key": "Red"
    },
    {
      "name": "Green",
      "key": "Green"
    },
    {
      "name": "Blue",
      "key": "Blue"
    }
  ]
}

现在我想搜索名称为 Adidas 或 Puma 的品牌。其他要求是只返回子文档,所以我尝试了下面给出的查询

find( { "Brand.name" : { $in : ["Reebok", "Adidas"]}},{"Brand" : 1, “_id”:0})

但它返回了品牌数组的所有三个对象

{
    "Brand" : [ 
        {
            "name" : "Adidas",
            "key" : "Adidas"
        }, 
        {
            "name" : "Reebok",
            "key" : "Reebok"
        }, 
        {
            "name" : "Puma",
            "key" : "Puma"
        }
    ]
}

我当然也可以通过 Javascript 来做到这一点(通过重新调整的数组和匹配值进行迭代),但是有什么方法可以让我的目的仅通过 Mongo Query 来解决。

注意:在支持 JSON 文档的 NoSql 系统中,最大的区别是这些系统不支持关系,但您始终可以通过子文档维护关系。如果无法进行此类查询(如上所述),那么我认为以子文档形式保存数据不是一个好习惯,因为您无法根据需要查询它。专家对此有何看法????

【问题讨论】:

标签: mongodb nosql


【解决方案1】:

$in in find 查询旨在返回文档而不是子文档。在您的情况下,mongoDB 提供了聚合框架。这将帮助您过滤子文档。

对于 mongoDB

db.collection.aggregate(
  { $project: { Brand: 1}},
  { $unwind: '$Brand'},
  { $match: { "Brand.name" : { $in : ["Reebok", "Adidas"]}}},
  { $group: { _id: '$_id', Brand: {$push : '$Brand' }}}
)

MongoDB 3.2 方式

db.collection.aggregate([
   {
      $project: {
         Brand: {
            $filter: {
               input: "$Brand",
               as: "Brand",
               cond: { "$$Brand.name": { $in : ["Reebok", "Adidas"]}}
            }
         }
      }
   }
])

【讨论】:

  • 已提供尝试查询并返回 "exception: invalid operator '$filter'"
  • $filter 仅在 mongodb 3.2 中可用。你用的是哪个版本?
  • 那你得用我贴的第一个聚合代码
  • 这就是错误:第 5 行:意外的令牌 {
  • 你确定吗?它给了我结果
【解决方案2】:

它工作正常。在mongo文档中是这样写的:

$in 运算符选择字段值等于指定数组中任意值的文档。

它向您返回了包含“Reebok”或“Adidas”的文档。

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 2019-01-16
    • 2015-10-31
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2017-11-18
    • 2023-03-20
    相关资源
    最近更新 更多