2016-05-22 44 views
2

我不太确定如何标题!选择数组中所有值存在于另一个数组中的文档

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

但返回约翰,虽然99并不在产品ID列表

我也试过存在:

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

,因为没有客户拥有所有的产品,没有返回

有没有办法在单个查询中实现我需要的功能,还是需要进行一些查询后处理?

我也试过

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

但这也似乎来回报客户的时候并不是所有的产品ID匹配

回答

2

您可以在此使用.aggregate()方法和$redact运营商做。在您的$cond表达式中,您需要使用$setIsSubset来检查“产品”数组中的所有元素是否都在“productIds”中。这是因为您不能在条件表达式中使用$in

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