2016-05-22 6 views
2

Ich war mir nicht sicher, wie ich dies title!Wählen Sie Dokumente, in denen alle Werte in einem Array-Feld in einem anderen Array vorhanden sind

So habe ich eine Reihe von Produkt-IDs

var productIds = [139,72,73,1,6] 

und eine Reihe von Kundendokumenten in MongoDB

{ 
    name: 'James', 
    products: [ 73, 139 ], 
    _id: 5741cff3f08e992598d0a39b 
} 

{ 
    name: 'John', 
    products: [ 72, 99 ], 
    _id: 5741d047f08e992598d0a39e 
} 

Ich mag würde, Kunden finden, wenn alle ihre Produkte im Array von Produkt-IDs (productIds)

ich habe versucht:

'products' : { 
    '$in': productIds 
} 

Aber das gibt John, obwohl 99 nicht in der Liste der Produkt-IDs existieren

ich auch versucht:

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

die nichts zurückgibt, weil keine der Kunde die Produkte haben alle

Gibt es eine Möglichkeit zu erreichen, was ich brauche in einer einzigen Abfrage oder werde ich einige Post-Abfrage-Verarbeitung tun müssen?

Ich habe auch versucht

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

aber dies scheint auch Kunden zurückzubringen, wenn nicht alle IDs Produkt

Antwort

2

mithalten können Sie dies die .aggregate() Methode tun verwenden und die $redact Betreiber. In Ihren $cond Ausdrücken müssen Sie die $setIsSubset verwenden, um zu überprüfen, ob alle Elemente im Array "products" sich in "productIds" befinden. Dies liegt daran, dass Sie $in im bedingten Ausdruck

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