如果我有以下有效载荷:
{
"objs": [
{ "_id": "1234566", "some":"data", "key": "one" },
{ "_id": "1234576", "some":"data", "key": "one" },
{ "_id": "2345666", "some":"otherdata", "key": "two" },
{ "_id": "4566666", "some":"yetotherdata", "key": "three" },
]
}
如何使用以下内容返回所有对象(objs):
key: "one"
_id: [1234566, 1234576]
由于
答案 0 :(得分:2)
find()
查询返回所有具有符合这两个条件的子文档的objs
。
var input = ["1234566","1234576"];
db.collection.find({$and:[{"objs._id":{$in:input}},{"objs.key":"one"}]})
如果要在objs
数组中获取已编校的文档,可以使用聚合管道操作来实现此目的。
$unwind
objs
元素,这为您提供了每个元素的单独文档
objs数组中的元素。$match
仅限符合选择条件的文件。$group
"_id"
mongo
文档自动生成 $project
。var input = ["1234566","1234576"];
db.collection.aggregate([
{$unwind:"$objs"},
{$match:{"objs._id":{$in:input},"objs.key":"one"}},
{$group:{"_id":"_id","objs":{$push:"$objs"}}},
{$project:{"_id":0,"objs":1}}
])
必填字段。守则:
{ "objs" :
[ { "_id" : "1234566", "some" : "data", "key" : "one" },
{ "_id" : "1234576", "some" : "data", "key" : "one" } ] }
O / P:
{{1}}
答案 1 :(得分:1)
你不能。 MongoDB返回与查询条件匹配的文档,而不是与查询条件匹配的单个部分。您可以使用投影来抑制或包含匹配文档的字段,但是您不能(从2.6开始)返回一个限制的数组,只是为了包含与数组上的条件匹配的元素。你可以用$
返回第一个这样的匹配db.collection.find(
{ "objs" : { "$elemMatch" : { "_id" : { "$in" : [1234566, 1234576] }, "key" : "one" } } }, // query
{ "_id" : 0, "objs.$" : 1 } // projection
)
如果要返回所有匹配的objs
元素,很可能应该将objs
数组中的每个子文档放入集合中自己的文档中。