仅查询子文档并返回匹配的子文档

时间:2015-12-11 07:48:46

标签: mongodb nosql

c示例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"
    }
  ]
}

现在我想搜索名称是阿迪达斯或彪马的品牌。其他重新处理是仅返回子文档,所以我尝试了下面给出的查询

  

find({" Brand.name":{$ in:[" Reebok"," Adidas"]}},{"品牌&# 34;:1,   " _id" :0})

但它将我所有三个Brand数组对象归还给我

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

我当然也可以通过Javascript来实现(通过重新调整的数组和metching值来迭代)但是有没有办法只用Mongo Query来解决我的目的。

注意:在支持JSON文档的NoSql Systems中,最大的区别是这些系统不支持关系,但您始终可以通过子文档维护关系。如果这样的查询(如上所述)是不可能的,那么我认为在子文档表单中保存数据并不是一种好的做法,因为您无法根据需要进行查询。关于这个的专家思考????

2 个答案:

答案 0 :(得分:3)

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

对于mongoDB< = 3.0.x

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"]}}
            }
         }
      }
   }
])

答案 1 :(得分:1)

它的工作正确。在mongo文档中写如下:

  

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

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