【问题标题】:Select documents where all values in an array field exist in another array选择一个数组字段中的所有值都存在于另一个数组中的文档
【发布时间】:2016-09-19 11:21:29
【问题描述】:

我不太确定如何命名!

所以我有一个产品 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
}

但这会返回 John,即使产品 ID 列表中不存在 99

我也试过了:

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

没有任何回报,因为没有客户拥有所有产品

有没有办法在单个查询中实现我所需要的,还是我必须做一些查询后处理?

我也试过

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多