我的数据库中有一个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"] }
期待一个有用的答案:)。
答案 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/