繁体   English   中英

Mongodb:查找具有数组的文档,其中所有元素都存在于查询数组中,但是文档数组可以更小

[英]Mongodb: find documents with array where all elements exist in query array, but document array can be smaller

我的数据库中有一个Collection,大多数文档都有一个array-field。 这些数组恰好包含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"] }

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

由于大小是静态的,因此您只需检查两个元素都在[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" ] }

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

db.tests.aggregate({
  $redact: {
    $cond: {
      if: {$eq: [ {$setIsSubset: [ '$a', [ "1", "2", "3" ] ]}]},
      then: '$$KEEP',
      else: '$$PRUNE'
    }
  }
})

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

$ in

(来自文档:)

考虑以下示例:

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

该查询选择清单集合中qty字段值为5或15的所有文档。尽管您可以使用$ or运算符表示此查询,但是在同一对象上执行相等性检查时,请选择$ in运算符而不是$ or运算符领域。

您还可以使用数组来做更复杂的事情。 结帐: http : //docs.mongodb.org/manual/reference/operator/query/in/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM