2014-04-09 48 views
0

我有以下文件:MongoDB的陣列MACHING

{ arr : [1,2,3] } 

而且我必須把它與以下比較:

a : [1,2] 

b : [2,3,1] 

c : [2,5,3,1] 

我需要返回的常用3,只有當它匹配所有的查詢查詢數組的元素。

在這個例子中,這將是「B」和「C」

我試圖與$所有類似如下:

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

但是,這並不工作,因爲它符合「一」太。 :(

回答

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}} ] } 
]}) 

或可能與$所有的操作員(我還沒有之前tryied但應該沒問題):

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 }} ] } 
]}) 
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+