选择其中数组字段中的所有值都存在于另一个数组中的文档

时间:2016-05-22 15:50:00

标签: node.js mongodb mongodb-query aggregation-framework

我不太确定如何标题这个!

所以我有一系列产品ID

var productIds = [139,72,73,1,6]

MongoDB中的一堆客户文档

{
    name: 'James',
    products: [ 73, 139 ],
    _id: 5741cff3f08e992598d0a39b
}

{
    name: 'John',
    products: [ 72, 99 ],
    _id: 5741d047f08e992598d0a39e
}

我希望在所有产品出现在产品ID数组(productIds)中时找到客户

我试过了:

'products' : {
    '$in': productIds
}

但即使产品ID列表中不存在99

,它也会返回John

我也尝试过:

'products' : {
    '$all': productIds
}

由于没有客户拥有所有产品

,因此不返回任何内容

有没有办法在单个查询中实现我需要的东西,或者我将不得不进行一些后期查询处理?

我也试过

'products': {
    '$in': productIds,
    '$not': {
        '$nin': productIds
    }
}

但是,当并非所有产品ID都匹配时,这似乎也会返回客户

1 个答案:

答案 0 :(得分:2)

您可以使用.aggregate()方法和$redact运算符执行此操作。在$cond表达式中,您需要使用$setIsSubset来检查“products”数组中的所有元素是否都在“productIds”中。这是因为您无法在条件表达式

中使用$in
var productIds = [139,72,73,1,6];
db.customers.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$setIsSubset": [ "$products", productIds ] },
            "$$KEEP",
            "$$PRUNE" 
        ] 
    }} 
])