select数组中所有值存在于另一个数组中的文档
我不太清楚如何标题!
所以我有一个产品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)数组中时,我想find客户
我试过了:
'products' : { '$in': productIds }
但是,即使产品ID列表中不存在99,也会返回John
我也试过:
'products' : { '$all': productIds }
没有任何回报,因为没有客户拥有所有的产品
有没有办法在单个查询中实现我所需要的function,还是需要进行一些查询处理?
我也试过了
'products': { '$in': productIds, '$not': { '$nin': productIds } }
但是当不是所有的产品ID匹配时,这似乎也会返还客户
您可以使用.aggregate()
方法和$redact
操作符来执行此操作。 在$cond
expression式中,您需要使用$setIsSubset
来检查“products”数组中的所有元素是否都在“productIds”中。 这是因为你不能在条件expression式中使用$in
var productIds = [139,72,73,1,6]; db.customers.aggregate([ { "$redact": { "$cond": [ { "$setIsSubset": [ "$products", productIds ] }, "$$KEEP", "$$PRUNE" ] }} ])