查找与一个但不是全部数组匹配的文档

时间:2018-02-12 18:52:20

标签: mongodb

给定一个名为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

1 个答案:

答案 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括号中定义的所有条件。