我有一些结构如下的测试文档:
{
"foo" : {
"bar" : [
{
"a" : [
"1",
"4"
]
},
{
"a" : [
"1",
"7"
]
}
]
}
}
现在我尝试获取所有这些文档,其中至少有一个“a”数组包含字符串“1”,“4”和“7”。 (注意:我知道不应该找到这个示例文档!)
现在我像这样查询数据库:
db.test.find({"foo.bar.a": {$all: ["1","4","7"]}})
在我看来它应该告诉我没有找到文件,但它找到了示例文档,因为“1”和“4”包含在第一个“a”数组中,“7”包含在第二个“一个“阵列。
这是$ all运算符的错误,还是我的查询错了?
答案 0 :(得分:0)
您可以将MongoDB 2.2+中的Aggregation Framework用于$unwind
foo.bar.a
数组到符合预期的文档流中。
示例查询:
db.test.aggregate(
// Could add a $match here to limit the number of relevant documents
// Create a stream of documents from the foo.bar array
{ $unwind: '$foo.bar' },
// Find arrays that have the desired elements
{ $match: {
'foo.bar.a': { $all: ["1","4","7"] }
}},
// Re-group by original document _id with matching array elements
{ $group: {
_id: "$_id",
'a': { $push: '$foo.bar.a' }
}}
)
示例结果:
{
"result" : [
{
"_id" : ObjectId("50f08b392aa92c6de18aa70a"),
"a" : [
[
"7",
"4",
"1"
]
]
},
{
"_id" : ObjectId("50f08b322aa92c6de18aa709"),
"a" : [
[
"1",
"4",
"7"
]
]
}
],
"ok" : 1
}
答案 1 :(得分:0)
这是你需要的吗?一个元素,其“a”数组包含所有指定的值。
db.test.find({“foo.bar”:{$ elemMatch:{“a”:{$ all:[“1”,“4”,“7”]}}}}}