查询包含在mongodb的另一个列表中的列表

我对mongo相当陌生,虽然我可以用$ in,$或$ all等方法来完成大部分的基本操作,但我无法做出我想要的工作。

我基本上会把我的问题的一个简单的forms。 我的部分文件是编号清单,例如:

{_id:1,list:[1,4,3,2]} {_id:2,list:[1]} {_id:3,list:[1,3,4,6]} 

我想要一个给定一个列表的查询(让我们称之为L),将返回给我的每个文档,其中整个列表在L中

例如与给定的列表L = [1,2,3,4,5]我想用_id 1和2来返回文档。 由于6不在L,所以3人不能退回。

“$ in”不起作用,因为它也会返回_id 3,“$ all”不起作用,因为它只会返回_id 1。

然后我想到“$哪里”,但我似乎无法find如何绑定一个外部variables的JS代码。 我所说的是,例如:

 var L = [1,2,3,4,5]; db.collections('myCollection').find({$where:function(l){ // return something with the list "l" there }.bind(null,list)}) 

我试图绑定列表的function,因为出现在那里,但无济于事……我很想欣赏关于这个问题的任何提示,谢谢。

有一个相关的问题检查数组中的每个元素是否匹配条件 与一个很好的方法回答这种情况。 它指的是embedded式文档的数组,但可以适应您的情况,如下所示:

 db.list.find({ "list" : { $not : { $elemMatch : { $nin : [1,2,3,4,5] } } }, "list.0" : { $exists: true } }) 

即。 该列表不能包含任何不在[1,2,3,4,5]中的元素,并且该列表必须至less存在一个元素(假设这也是一个要求)。

你可以尝试使用这个聚合框架 ,在这里你可以使用集合运算符来实现这一点,特别是你需要$setIsSubset运算符,如果第一个集合的所有元素出现在第二集合中,第一套等于第二套; 即不是一个严格的子集。

例如:

 var L = [1,2,3,4,5]; db.collections('myCollection').aggregate([ { "$project": { "list": 1, "isSubsetofL": { "$setIsSubset": [ "$list", L ] } } }, { "$match": { "isSubsetofL": true } } ]) 

结果

 /* 0 */ { "result" : [ { "_id" : 1, "list" : [ 1, 4, 3, 2 ], "isSubsetofL" : true }, { "_id" : 2, "list" : [ 1 ], "isSubsetofL" : true } ], "ok" : 1 }