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操作符来执行此操作。 在$condexpression式中,您需要使用$setIsSubset来检查“products”数组中的所有元素是否都在“productIds”中。 这是因为你不能在条件expression式中使用$in

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