[英]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.