查询以检索数组中的多个项目

时间:2014-11-20 23:57:32

标签: mongodb

如果我有以下有效载荷:

{
    "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]

由于

2 个答案:

答案 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数组中的每个子文档放入集合中自己的文档中。