2016-07-12 10 views
1

Ich habe zwei Sammlungen und ich möchte Felder von beiden erhalten, also verwende ich $lookup in einer Aggregationspipeline.

Dies funktioniert einwandfrei und gibt alle Dokumente mit einem zusätzlichen Feld, einem Array mit 0 oder 1 Elementen (ein Objekt) zurück. Wenn 0 Elemente, bedeutet dies, dass die JOIN (in SQL-Welt) nichts zurückgegeben hat. Wenn 1 Element, bedeutet dies, dass es eine Übereinstimmung und das Element in einem Objekt mit den Feldern der zweiten Sammlung gab.

Jetzt, da ich diese Ergebnisse habe, möchte ich $match verwenden, um einige der Ergebnisse zu filtern.

Um $match zu verwenden, möchte ich zuerst $unwind auf diesem neuen zusätzlichen Feld verwenden, um das Array zu extrahieren. Das Problem ist, sobald ich die $unwind Bühne einfügen, ist das Ergebnis der Abfrage ein einziges Dokument.

Warum passiert das? Wie kann ich $unwind und dann $match alle Dokumente, die ich von der $lookup Bühne bekommen habe?

Antwort

2

nehmen wir haben Dokumente nach lookup:

{doc:{_id:1, lookupArray:[{doc:1},{doc:2}]}} 

und

{doc:{_id:2, lookupArray:[/* empty */]}} 

wenn wir $unwind ohne Optionen, die wir erhalten:

  1. {doc: {_ id: 1, lookupArray: {doc: 1}}}
  2. {doc: {_ id: 1 , LookupArray: {doc: 2}}}
  3. null

und wenn wir angeben

{ $unwind: { path: "$array", preserveNullAndEmptyArrays: true } } 

dann erhalten wir:

  1. {doc: {_ id: 1, lookupArray: {doc: 1}}}
  2. {doc: {_ ID: 1, lookupArray: {doc: 2}}}
  3. {doc: {_ ID: 2, lookupArray: [/ * leer * /]} }

Also, wenn Sie eine Suche nach einem Wert doc von lookupArray ausführen möchten, $match wird wie folgt aussehen:

{$match:{'lookupArray.doc':2}} 

Alle Kommentare willkommen!

+0

Was ist, wenn ich die '$ lookup' durchführen möchte und auch nach einer Bedingung filtern möchte? So würde ich nur 1 (oder 0) Ergebnisse für das neu erstellte Feld bekommen. Oder mit anderen Worten, wenn ich am Ende mehrere Objekte im neuen Feld habe, gibt es eine Möglichkeit, dieses Feld zu filtern und nur das Objekt mit 'doc: 2' zu belassen? – alexandernst

+0

können Sie '$ project' verwenden, um die Form des Dokuments zu manipulieren - wenn das Ihnen geholfen hat, markieren Sie bitte als Antwort :-) – profesor79

+0

Keine Sorge, ich werde Ihre Antwort markieren. Kannst du ein bisschen weiter erklären, wie ich es mit '$ project' machen würde? – alexandernst