mongodb - 仅检索 MongoDB 集合中对象数组中的查询元素

标签 mongodb mongodb-query aggregation-framework projection

假设我的收藏中有以下文档:

{  
   "_id":ObjectId("562e7c594c12942f08fe4192"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"blue"
      },
      {  
         "shape":"circle",
         "color":"red"
      }
   ]
},
{  
   "_id":ObjectId("562e7c594c12942f08fe4193"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"black"
      },
      {  
         "shape":"circle",
         "color":"green"
      }
   ]
}
<小时/>

进行查询:

db.test.find({"shapes.color": "red"}, {"shapes.color": 1})

或者

db.test.find({shapes: {"$elemMatch": {color: "red"}}}, {"shapes.color": 1})
<小时/>

返回匹配的文档(文档 1),但始终包含形状中的所有数组项:

{ "shapes": 
  [
    {"shape": "square", "color": "blue"},
    {"shape": "circle", "color": "red"}
  ] 
}

但是,我只想获取包含 color=red 的数组的文档(文档 1):

{ "shapes": 
  [
    {"shape": "circle", "color": "red"}
  ] 
}

我该怎么做?

最佳答案

MongoDB 2.2 的新功能 $elemMatch投影运算符提供了另一种方法来更改返回的文档,使其仅包含第一个匹配的shapes元素:

db.test.find(
    {"shapes.color": "red"}, 
    {_id: 0, shapes: {$elemMatch: {color: "red"}}});

返回:

{"shapes" : [{"shape": "circle", "color": "red"}]}

在 2.2 中,您还可以使用 $ projection operator 来执行此操作,其中投影对象字段名称中的 $ 表示查询中该字段的第一个匹配数组元素的索引。以下返回与上面相同的结果:

db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

MongoDB 3.2 更新

从 3.2 版本开始,您可以使用新的 $filter聚合运算符在投影期间过滤数组,其优点是包含所有匹配项,而不仅仅是第一个匹配项。

db.test.aggregate([
    // Get just the docs that contain a shapes element where color is 'red'
    {$match: {'shapes.color': 'red'}},
    {$project: {
        shapes: {$filter: {
            input: '$shapes',
            as: 'shape',
            cond: {$eq: ['$$shape.color', 'red']}
        }},
        _id: 0
    }}
])

结果:

[ 
    {
        "shapes" : [ 
            {
                "shape" : "circle",
                "color" : "red"
            }
        ]
    }
]

关于mongodb - 仅检索 MongoDB 集合中对象数组中的查询元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52130213/

相关文章:

performance - MongoDB文本索引搜索大表中的常用词很慢

MongoDB 我应该创建自己的 ID 键列吗?

arrays - 查询 MongoDB 中的整个对象数组

php - 如何在 phalcon 中将 "group by"、 "having"查询从 mysql 转换为 mongodb

mongodb - Mongo 部分 AND TTL 索引

Mongodb 聚合 : get referenced document field value

MongoDB/RethinkDB 是否使用 ODM?

node.js - 如何在查询中使用 $push 将数据插入子文档,而不是检索文档并将其保存回来

Mongodb加入从String到ObjectId的_id字段

java - 将 AggregationOutput 转换为 JsonObject