选择一个数组字段中的所有值都存在于另一个数组中的文档
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