假设您在我的收藏中有以下文档:
{ "_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:
shapes
{ "shapes": [ {"shape": "square", "color": "blue"}, {"shape": "circle", "color": "red"} ] }
但是,我想仅使用包含以下内容的数组获取文档 (文档 1)color=red:
color=red
{ "shapes": [ {"shape": "circle", "color": "red"} ] }
我怎样才能做到这一点?
MongoDB 2.2 的新$elemMatch投影运算符提供了另一种更改返回文档以仅包含第 一个 匹配shapes元素的方法:
$elemMatch
db.test.find( {"shapes.color": "red"}, {_id: 0, shapes: {$elemMatch: {color: "red"}}});
回报:
{"shapes" : [{"shape": "circle", "color": "red"}]}
在 2.2 中,您还可以使用 来执行此操作$ projection operator,其中$投影对象字段名称中的 表示查询中该字段的第一个匹配数组元素的索引。以下返回与上述相同的结果:
$ projection operator
$
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});
MongoDB 3.2 更新
从 3.2 版本开始,您可以使用新的$filter聚合运算符在投影期间过滤数组,这具有包括 所有 匹配项的好处,而不仅仅是第一个匹配项。
$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" } ] } ]