2016-05-22 45 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" 
     ] 
    }} 
]) 
相關問題