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

Mongoose:Wie kann man eine 2-Level-Tiefenbevölkerung bevölkern, ohne Felder der ersten Ebene zu bevölkern? in mongodb

Als begeisterter Mongodb-Fan schlage ich vor, dass Sie eine relationale Datenbank für stark relationale Daten verwenden – dafür wurde sie entwickelt. Sie verlieren alle Vorteile von mongodb, wenn Sie mehr als 3 Abfragen durchführen müssen, um ein einzelnes Objekt zu erhalten.

Buuuuut , ich weiß, dass dieser Kommentar auf taube Ohren stoßen wird. Ihre beste Wette ist es, so bewusst wie möglich über die Leistung zu sein. Ihr erster Schritt besteht darin, die Felder auf das erforderliche Minimum zu beschränken. Dies ist nur eine bewährte Vorgehensweise, selbst bei einfachen Abfragen und beliebigen Datenbank-Engine - erhalten Sie nur die Felder, die Sie benötigen (zB SELECT * FROM ===schlecht... hör einfach auf damit!). Sie können auch versuchen, schlanke Abfragen durchzuführen, um viel Nachbearbeitungsarbeit zu sparen, die Mongoose mit den Daten macht. Ich habe das nicht getestet, aber es sollte funktionieren...

SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
    name: 'fieldB',
    select: 'fieldC',
    options: { lean: true }
}).exec(function (err, result) {
    // not sure how you are populating "result" in your example, as it should be an array, 
    // but you said your code works... so I'll let you figure out what goes here.
});

Eine sehr "mongoische" Art, das zu tun, was Sie wollen, ist auch, eine Referenz in SchemaC zurück zu SchemaA zu speichern. Wenn ich „Mongo“ sage, müssen Sie sich von Ihrem jahrelangen Nachdenken über relationale Datenabfragen lösen. Tun Sie alles Notwendige, um weniger Abfragen in der Datenbank durchzuführen, selbst wenn dies bidirektionale Referenzen und/oder Datenduplizierung erfordert.

Wenn ich beispielsweise ein Book-Schema und ein Author-Schema hätte, würde ich wahrscheinlich den Vor- und Nachnamen des Autors in der Books-Sammlung zusammen mit einem _id-Verweis auf das vollständige Profil in der Authors-Sammlung speichern. Auf diese Weise kann ich meine Bücher in einer einzigen Abfrage laden, trotzdem den Namen des Autors anzeigen und dann einen Hyperlink zum Profil des Autors generieren:/author/{_id} . Dies ist als „Datendenormalisierung“ bekannt und verursacht bekanntermaßen Sodbrennen. Ich versuche, es für Daten zu verwenden, die sich nicht sehr oft ändern – wie die Namen von Personen. Für den Fall, dass sich ein Name ändert, ist es trivial, eine Funktion zu schreiben, um alle Namen an mehreren Stellen zu aktualisieren.