Mongodb:查找带有数组的文档,查询数组中存在所有元素,但文档数组可以更小

时间:2014-06-18 18:13:13

标签: arrays node.js mongodb nosql-aggregation

我的数据库中有一个Collection,其中大多数文档都有一个数组字段。这些数组包含完全 2个元素。现在我想找到所有这些数组元素都是查询数组元素的文档。

示例文件:

{ a:["1","2"] },
{ a:["2","3"] },
{ a:["1","3"] },
{ a:["1","4"] }

查询数组:

["1","2","3"]

查询应该找到前3个文档,但不是最后一个,因为我的查询数组中没有“4”。

预期结果:

{ a:["1","2"] },
{ a:["2","3"] },
{ a:["1","3"] }

期待一个有用的答案:)。

3 个答案:

答案 0 :(得分:2)

由于大小是静态的,您可以检查两个元素是否在[1,2,3];

db.test.find(
  { $and: [ { "a.0": {$in: ["1","2","3"] } },
            { "a.1": {$in: ["1","2","3"] } } ] },
  { _id: 0, a: 1 }
)

>>> { "a" : [ "1", "2" ] }
>>> { "a" : [ "2", "3" ] }
>>> { "a" : [ "1", "3" ] }

编辑:动态地做它有点毛茸茸,我想不出没有聚合框架的方法。只需将匹配计为0,将非匹配计为1,最后删除所有具有总和的组!= 0;

db.test.aggregate(
  { $unwind: "$a" },
  { $group: { _id: "$_id", 
              a: { $push: "$a" },
              fail: { $sum: {$cond: { if: { $or: [ { $eq:["$a", "1"] },
                                                   { $eq:["$a", "2"] },
                                                   { $eq:["$a", "3"] }]
                                          },
                                      then: 0,
                                      else: 1 } } } } },
  { $match: { fail: 0 } },
  { $project:{ _id: 0, a: 1 } } 
)

>>> { "a" : [ "1", "3" ] }
>>> { "a" : [ "2", "3" ] }
>>> { "a" : [ "1", "2" ] }

答案 1 :(得分:1)

我还认为,没有聚合框架是不可能的(如果元素计数是动态的)。 但我发现了更普遍的做法:

getline

答案 2 :(得分:0)

我相信你的问题的答案是使用

  

$

(来自文档:)

考虑以下示例:

  

db.inventory.find({qty:{$ in:[5,15]}})

此查询选择库存集合中qty字段值为5或15的所有文档。虽然您可以使用$或运算符表达此查询,但在执行相等性检查时选择$ in运算符而不是$或运算符在同一个领域。

您还可以使用数组执行更复杂的操作。查看: http://docs.mongodb.org/manual/reference/operator/query/in/