给定一个名为favorites的集合,如下所示:
[
{
"_id" : NUUID("575fbfca-688b-497f-8e88-c14834b2a0b8"),
"Version" : 5,
"Name" : "Default Favorites List",
"SpeciesIds" : [ 1000, 2000, 3000 ],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 1 */
{
"_id" : NUUID("75eff3df-0457-49c7-ade2-141fa75d526e"),
"Version" : 15,
"Name" : "Super Secret List",
"SpeciesIds" : [ 1000, 4000, 5000 ],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 2 */
{
"_id" : NUUID("1aa5d3d2-3056-4b73-ace9-f1e56fd77329"),
"Version" : 5,
"Name" : "Cool list",
"SpeciesIds" : [
2000, 3000, 6000
],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 3 */
{
"_id" : NUUID("98ee31fb-509b-4635-ac1a-564b7b34beb9"),
"Version" : 1,
"Name" : "Galaxy S4",
"SpeciesIds" : [
4000, 5000, 6000
],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 4 */
{
"_id" : NUUID("2297dcb8-c135-499e-98cb-b6cf80449bd2"),
"Version" : 3,
"Name" : "Meta List",
"SpeciesIds" : [
1000, 9000, 10000, 5555, 33333
],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
}
]
我需要构建一个查询,该查询返回至少包含一个SpeciesIds数组的文档,但不匹配SpeciesIds数组中的所有项。
我能够构建匹配它的第一部分,如果它至少有一部分,而不是“不是全部”部分。这给了我一个错误,意外的令牌:。
db.favorites.find(
{
SpeciesIds: {$in: [1000, 2000, 3000]},
SpeciesIds: { $nor: [ $all: [1000, 2000, 3000]]}
});
结果应该是:
[
/* 1 */
{
"_id" : NUUID("75eff3df-0457-49c7-ade2-141fa75d526e"),
"Version" : 15,
"Name" : "Super Secret List",
"SpeciesIds" : [ 1000, 4000, 5000 ],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 2 */
{
"_id" : NUUID("1aa5d3d2-3056-4b73-ace9-f1e56fd77329"),
"Version" : 5,
"Name" : "Cool list",
"SpeciesIds" : [
2000, 3000, 6000
],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
},
/* 4 */
{
"_id" : NUUID("2297dcb8-c135-499e-98cb-b6cf80449bd2"),
"Version" : 3,
"Name" : "Meta List",
"SpeciesIds" : [
1000, 9000, 10000, 5555, 33333
],
"UserId" : "84f059e8-90b3-47b8-a03a-1bbe90ad59a4"
}
]
它排除了第一个,因为 ALL 3的元素匹配
什么是正确的语法来解决这个问题?我应该提一下,这是mongodb 2.6.6
答案 0 :(得分:2)
您使用第二个SpeciesIds
条件覆盖条件。
db.favorites.find(
{
SpeciesIds: {$in: [1000, 2000, 3000]},
SpeciesIds: { $nor: [ $all: [1000, 2000, 3000]]}
});
而不是上面的查询,它应该是这样的:
db.getCollection('stack').find({
$and: [{
SpeciesIds: {
$in: [1000, 2000, 3000]
}
}, {
SpeciesIds: {
$not: {
$all: [1000, 2000, 3000]
}
}
}]
})
返回的文档确保$and
括号中定义的所有条件。