通过数组交集

时间:2018-01-21 05:05:25

标签: node.js mongodb

我有什么:

  • 我想查询的字符串数组。 ['a', 'b', 'c']

数据我查询:

  • foo类型的对象集合,所有对象都带有bar字段。 bar字段是一个字符串数组,与我查询的字符串类型相同,可能包含一些相同的元素。

foo1 = { bar: ['a'] }

foo2 = { bar: ['d'] }

foo3 = { bar: ['a', 'c']}

我需要什么:

  • 返回查询数组中包含整个foo数组的所有bar个对象的查询。在上面的示例中,我希望foo1foo3回来

1 个答案:

答案 0 :(得分:2)

使用聚合

您可能需要在汇总管道中使用$setIsSubset

db.col.aggregate(
    [
        {$project : { bar : 1 , isSubset: { $setIsSubset : [ "$bar" , ['a','b','c'] ] }}}, 
        {$match : { isSubset : true}}
    ]
)

集合

> db.col.find()
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767b"), "bar" : [ "a" ] }
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767c"), "bar" : [ "a", "c" ] }
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767d"), "bar" : [ "d" ] }

聚合

> db.col.aggregate([{$project : { bar : 1 , isSubset: { $setIsSubset : [ "$bar" , ['a','b','c'] ] }}}, {$match : {isSubset : true}}])
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767b"), "bar" : [ "a" ], "isSubset" : true }
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767c"), "bar" : [ "a", "c" ], "isSubset" : true }
> 

修改

使用查找$expr

db.col.find({$expr : { $setIsSubset : [ "$bar" , ['a','b','c'] ] }})

结果

> db.col.find({$expr : { $setIsSubset : [ "$bar" , ['a','b','c'] ] }})
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767b"), "bar" : [ "a" ] }
{ "_id" : ObjectId("5a6420d984eeec7b0b2f767c"), "bar" : [ "a", "c" ] }
>