MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Der Versuch, Mongoose nur zu füllen, wenn ref nicht null ist - funktioniert nicht

Sie müssen die Ausführungsreihenfolge Ihres Codes verstehen:

  1. mongoose bekommt alle Bücher aus der Datenbank wo {_creator:{$ne:null}} . Mongo sieht sich nur die Referenz in der Büchersammlung an, um zu bestimmen, welche Dokumente zurückgegeben werden sollen. Ihr Buch enthält immer noch einen Verweis auf einen Autor, und mongo wird nicht bemerken, dass es keinen übereinstimmenden Autor in der Autorensammlung gibt, sodass Ihr Buch geladen wird.

  2. mongoose füllt alle zurückgegebenen Ergebnisse:Es lädt also die Autoren aus der Authors-Sammlung und ersetzt die Referenzen durch die echten Objekte. Für Ihr Buch findet es keinen passenden Autor, also setzt es den null dort.

Deshalb landen Sie bei Ihrer Ergebnisliste.

Mongo unterstützt keine Verknüpfungen – daher können Sie keine Abfrage durchführen, die Daten aus mehr als einer Sammlung enthält. Auffüllen ist nur eine Möglichkeit, Referenzen in Ihrer Ergebnisliste durch echte Daten zu ersetzen, Sie können niemals aufgefüllte Daten als Teil Ihrer where-Klauseln verwenden.

Um Ihr Problem zu lösen, können Sie entweder:

  • Filtern Sie Ihre endgültige Ergebnisliste im JS-Code, z. mit _.filter der Lodash-Bibliothek.
  • Aktualisieren Sie alle Ihre Bücher und entfernen Sie die Referenz, wenn Sie einen Autor löschen. Dazu können Sie Hooks auf dem Autorenschema verwenden.

AuthorSchema.post('remove', function(doc) {// update your books here});