Mongoose: Ist es möglich, ohne `_id` aufzufüllen?

Erstellt am 26. Dez. 2014  ·  82Kommentare  ·  Quelle: Automattic/mongoose

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?

enhancement

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.

Alle 82 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen