我有以下文件:
{ 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”。 :(
答案 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 +