Mongodb阵列加工

时间:2014-04-09 21:03:01

标签: arrays mongodb

我有以下文件:

{ arr : [1,2,3] }

我必须将其与以下内容进行比较:

a : [1,2]

b : [2,3,1]

c : [2,5,3,1]

我需要创建一个只在匹配查询数组的所有元素时返回arr的查询。

在示例中,它将是“b”和“c”

我尝试使用以下所有内容:

find(arr:{$all:a}) (the same for b and c)

但这不起作用,因为它也匹配“a”。 :(

2 个答案:

答案 0 :(得分:0)

试试这个:

find( {$or:[
    { $and: [ { arr: 1 }, { arr: 2 }, {arr:{$size:2}} ] },
    { $and: [ { arr: 1 }, { arr: 2 }, { arr: 3 }, {arr:{$size:3}} ] },
    { $and: [ { arr: 1 }, { arr: 2 }, { arr: 3 }, { arr: 5 }, {arr:{$size:4}} ] }
]})

或者可能使用$ all运算符(我之前没有试过,但应该没问题):

find( {$or:[
    { $and: [ { arr: { $all: a } }, {arr:{$size: a.length }} ] },
    { $and: [ { arr: { $all: b } }, {arr:{$size: b.length }} ] },
    { $and: [ { arr: { $all: c } }, {arr:{$size: c.length }} ] }
]})

答案 1 :(得分:0)

您可以使用聚合框架及其集合操作来选择作为查询数组子集的数组:

> db.foo.insert({arr:[1,2,3]})
> db.foo.insert({arr:[3,2,1]})
> db.foo.insert({arr:[3,2,1,4]})

然后

 db.foo.aggregate([ 
    { $project: { arr:'$arr', isIn: { $setIsSubset: ['$arr', [2,5,3,1]] }}}, 
    { $match: { isIn: true }} 
])

返回

{ "_id" : ObjectId("5345beb536cdafd3eb4a6b16"), "arr" : [ 1, 2, 3 ], "isIn" : true }
{ "_id" : ObjectId("5345bec036cdafd3eb4a6b17"), "arr" : [ 3, 2, 1 ], "isIn" : true }

请注意,这需要版本2.6 +