Ich habe die API http://mongoosejs.com/docs/populate.html überprüft und ausprobiert. Es scheint, dass populate
nur auf fremden _id
funktionieren kann. Auch wenn es eine match
Option gibt, fügt sie nur weitere Filterbedingungen zur _id
Abfragebedingung hinzu. Es gibt keine Möglichkeit, einfach mit Feldern zu füllen, die nicht mit _id
.
In meinem Projekt behalten wir _id
als ObjectId und haben ein weiteres Feld als Auto-Increment-Nummer. Das Modell customers
hat beispielsweise _id
als Objekt und cuid
als inkrementelle Zahl. Andere Sammlungen verweisen nur auf cuid
nicht auf _id
.
Wäre toll, dies anpassen zu können?
Gibt es eine Designbeschränkung, die dazu führt, dass diese Funktion fehlt?
Es wäre großartig, dies anpassen zu können, aber im Moment erzwingen wir _id
. Mir fällt kein triftiger Grund ein, warum nicht. Ich muss weiter recherchieren.
Die Fähigkeit, nicht nur ein einzelnes anderes Feld, sondern sogar eine Reihe von Feldern auszufüllen, ist fast erforderlich, um das Sharding richtig zu unterstützen, was für uns ein großer Anwendungsfall ist.
Zum Beispiel haben wir eine Sammlung "Studenten", die einen Shard-Schlüssel für "Abonnement" haben kann; Wenn wir Schülerdaten aus unserem Abschnittsmodell (das eine Reihe von Schülern enthält) auffüllen, haben wir das Abonnement für das Dokument, aber es wird nur basierend auf der in "Student" gespeicherten _id gesucht, anstatt anzugeben, dass es auch zugeordnet werden soll das Dokumentenfeld "Aufgabe" auf "Aufgabe" auf den Studenten.
Da wir dann beim Auffüllen ohne den Shard-Schlüssel nachschlagen würden, wird das Sharding nutzlos, sodass alle Shards getroffen werden müssen, um die Daten abzurufen, anstatt nur eine.
Dies ist etwas, wofür wir bereit wären, die Entwicklung zu finanzieren oder sogar selbst zu tun, wenn wir eine Anleitung bekommen könnten, wo die Arbeit zu tun ist. Es ist ein großer Bedarf für unser Unternehmen (GradeCam).
@taxilian stellen Sie die shardKey
? AFAIK dafür ist diese Option da.
Ich habe mich noch nicht dazu bewegt, damit zu beginnen, weil ich nach einer Lösung für dieses Problem gesucht habe. Berücksichtigt Auffüllen ShardKey? Nach meinem Verständnis betraf ShardKey nur Updates und Einfügungen
Es wäre großartig, das Feld angeben zu können, das "beigetreten" werden soll, zum Beispiel möchte ich in der Lage sein, nicht nur das Feld userId (dh _id), sondern auch userType, userGroup usw.
Danke!
+1
+1 wäre sehr hilfreich
+1 gleich hier!
+1 Ich liebe es, das zu haben
+1
+1
+1
Es wäre besonders schön, die Variable auswählen zu können, mit der Sie füllen möchten, indem Sie einen Parameter wie key
hinzufügen:
Zum Beispiel, wenn ich Posts hätte, von denen ich die Parameter author
und comments
ausfüllen wollte, aber die Parameter enthalten Nicht-ObjectId-Parameter (Benutzername des Benutzers und Titel der Kommentare) vor dem Auffüllen:
{
author: "user1",
comments:["comment5", "comment6"],
title:"Post1"
}
Es wäre schön, einen Parameter wie "key" hinzufügen zu können, um Mongo mitzuteilen, nach welchem Parameter gesucht werden soll:
Posts.find().populate([{path:"author", model:"Users", key:"username"}, {path:"comments", model:"Comments", key:"title"}])
Dies würde den Parameter author
mit einem nach Benutzernamen gefundenen Benutzer sowie den Parameter comments
mit Kommentaren füllen, die nach ihrem Titel gefunden wurden (ich weiß, dass die Kommentare nach Titel ein wenig unrealistisch sind, aber Sie bekommen Der Punkt).
+1
+1
+1
+1
+1
+1
+1
Große Zustimmung. Ich würde die Möglichkeit lieben, benutzerdefinierte Bevölkerungsschemata zu definieren. Es wäre ideal für jedes Schema mit einem oder mehreren Feldern, die Dateipfade sind, damit die Daten aus dem Speicher gelesen werden können.
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
Probieren Sie diesen Code aus: https://github.com/alexmingoia/mongoose-populate-virtuals.
Gibt es eigentlich einen Grund, Alex' Code nicht in das Hauptrepo zu integrieren und dies zu einer Kernfunktion zu machen?
@rturk Ich mag dieses Plugin wirklich sehr, danke für den Hinweis. @alexmingoia was bevöl (ohne ein tatsächliches Feld auf den db beharrte hat) ist wirklich mächtig.
Das wäre ideal. Es wäre im Kern viel besser, da es Query.prototype.populate
und andere Kernfunktionen überlastet.
Das einzige, was mich daran hindert, einen Pull-Request zu erstellen, ist, dass es wenig bis keine Testabdeckung gibt und die Dokumentation fehlt. Ich verwende es in der Produktion in mehreren Szenarien und es ist stabil, aber ich denke, wenn jemand eine Testsuite schreiben würde, könnte dies einige kleinere Probleme oder Eigenheiten aufdecken, die dokumentiert werden müssen.
Ist jemand bereit, die Testsuite in Angriff zu nehmen? Wenn nicht - ich kann es tun, aber erwarte nicht, dass das vor dem nächsten Monat landet.
Ich schau mal nach. Ich wollte bevölkern sowieso neu schreiben :)
Ping mich im IRC (freenode, amingoia
) oder gitter an, wenn du Fragen zum Code hast.
https://github.com/whitecolor/mongoose-fill leistet auch gute Arbeit, um Daten von anderen Modellen zu verwenden
+1
+1
+1
das ist ein Muss :)
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+3
+1
Hilfreichster Kommentar
@rturk Ich mag dieses Plugin wirklich sehr, danke für den Hinweis. @alexmingoia was bevöl (ohne ein tatsächliches Feld auf den db beharrte hat) ist wirklich mächtig.