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

Posted

技术标签:

【中文标题】选择一个数组字段中的所有值都存在于另一个数组中的文档【英文标题】: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 都匹配时返回客户

【问题讨论】:

【参考方案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" 
        ] 
     
])

【讨论】:

以上是关于选择一个数组字段中的所有值都存在于另一个数组中的文档的主要内容,如果未能解决你的问题,请参考以下文章

根据存在于另一个模型数组中的日期对模型数组进行排序。斯威夫特 3

如果值存在于另一个字段数组中,Laravel 验证规则

如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?

如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]

如何确定数组中的值是不是存在于 Postgres 表中

C# 从 List<T> 中选择存在于另一个列表中的所有元素