Finde nach dem Befüllen von Mangusten

8

Ich habe Probleme, ein Dokument nach Werten abzufragen, die im Dokument nach der Population mit Mungo übereinstimmen.

Meine Schemas sind ungefähr so:

%Vor%

Ich hätte gerne alle Benutzer, die zB eine Email mit dem type="Gmail" haben.

Die folgende Abfrage gibt leere Ergebnisse zurück:

%Vor%

Ich musste die Ergebnisse in JS wie folgt filtern:

%Vor%

Gibt es eine Möglichkeit, so etwas direkt aus dem Mungo zu befragen?

    
Monokh 11.07.2015, 13:37
quelle

2 Antworten

10

@Jason Cust hat es bereits ziemlich gut erklärt - in dieser Situation ist es oft die beste Lösung, das Schema zu ändern, um die Abfrage von Users nach Eigenschaften von Dokumenten in separaten Sammlungen zu verhindern.

Hier ist die beste Lösung, die ich mir vorstellen kann, die Sie jedoch nicht dazu zwingen wird (weil Sie in dem Kommentar gesagt haben, dass Sie das nicht können).

%Vor%

Was wir hier tun, füllt nur email s passende zusätzliche Abfrage ( match Option in .populate() Aufruf) - andernfalls wird email Feld in Users Dokumente auf null .

Alles, was übrig bleibt, ist .filter auf dem zurückgegebenen users -Array, wie in Ihrer ursprünglichen Frage - nur mit viel einfacherer, sehr generischer Prüfung. Wie Sie sehen können - entweder email ist da oder nicht.

    
bardzusny 11.07.2015, 18:22
quelle
3

Die Funktion populate von Mongoose wird nicht direkt in Mongo ausgeführt. Stattdessen, nachdem die erste find -Abfrage ein Set von Dokumenten zurückgibt, erstellt populate ein Array mit einzelnen find -Abfragen für die referenzierte Sammlung, die ausgeführt werden soll, und fügt die Ergebnisse dann wieder in die Originaldokumente ein. Im Wesentlichen versucht Ihre find -Abfrage, eine Eigenschaft des referenzierten Dokuments (die noch nicht abgerufen wurde und daher undefined lautet) zu verwenden, um die ursprüngliche Ergebnismenge zu filtern.

In diesem Anwendungsfall scheint es sinnvoller, E-Mails als Filialdokument-Array und nicht als separate Sammlung zu speichern, um das zu erreichen, was Sie tun möchten. Als ein allgemeines Entwurfsmuster für Dokumentenspeicher ist dies einer der Anwendungsfälle, die sinnvoll sind, um ein Array als Filialdokument zu speichern: begrenzte Größe und sehr wenige Modifikationen.

Aktualisieren Sie Ihr Schema auf:

%Vor%

Dann sollte die folgende Abfrage funktionieren:

%Vor%     
Jason Cust 11.07.2015 15:45
quelle