Wie kann ich "Komponenten" im Beispieldokument ausfüllen:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
Dies ist mein JS, wo ich ein Dokument von Mongoose bekomme:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
bekomme ich dasselbe wie im Beispieldokument angegeben. Nichts wird geändert.Antworten:
Mongoose 4.5 unterstützen dies
Und Sie können mehr als einer tiefen Ebene beitreten
quelle
pages.$.page.component
nicht istpages.$.component
. Woher weiß es, im Seitenobjekt auszusehen?Das ist für mich in Ordnung:
Dokumentation: Model.populate
quelle
Wie andere angemerkt haben,
Mongoose 4
unterstützt dies. Es ist sehr wichtig zu beachten, dass Sie bei Bedarf auch tiefer als eine Ebene zurückgreifen können - obwohl dies in den Dokumenten nicht vermerkt ist:quelle
Sie können mehrere verschachtelte Dokumente wie folgt füllen.
quelle
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
Es ist die beste Lösung:
quelle
page
andere nicht bevölkerungsfähige Eigenschaften vorliegen .Ich fand es sehr hilfreich, vor dem Hook ein Feathersjs zu erstellen, um eine tiefe Beziehung mit 2 Ref-Levels zu füllen. Die Mungomodelle haben einfach
dann in federn vor dem haken:
So einfach im Vergleich zu einigen anderen Methoden, dass ich versucht habe, dies zu erreichen.
quelle
Ich fand diese Frage durch eine andere Frage, die KeystoneJS-spezifisch war, aber als Duplikat markiert wurde. Wenn jemand hier nach einer Keystone-Antwort sucht, habe ich auf diese Weise meine Deep-Populate-Abfrage in Keystone durchgeführt.
Mungopopulation auf zwei Ebenen mit KeystoneJs [Duplikat]
quelle
Sie können dies auch mithilfe der
$lookup
Aggregation tun, und der wahrscheinlich beste Weg, wie jetzt zu bevölkern, ist das Aussterben des Mongosquelle
Mongoose 5.4 unterstützt dies
quelle
Für jemanden, der das Problem hat
populate
und dies auch tun möchte:clients
,users
,rooms
,messasges
.refPath
oder dynamische Referenzpopulate
mitpath
undmodel
OptionenfindOneAndReplace
/replaceOne
mit$exists
KONTEXT
Tor
clients
,users
&bot
.clients
oderusers
seine Mungomodelle haben. _sender Typ Client-Modelle istclients
, für Benutzer istusers
.Nachrichtenschema :
LÖSUNG
Meine serverseitige API-Anfrage
Mein Code
Dienstprogrammfunktion (in
chatUtils.js
Datei), um den Nachrichtentyp abzurufen, den Sie speichern möchten:Meine Serverseite (mit Nodejs), um die Anforderung zum Speichern der Nachricht zu erhalten:
TIPPS :
Für die Datenbank:
refPath
, verwenden wir das utilgetSenderModel
, das für verwendet wirdpopulate()
. Das liegt am Bot. Dassender.type
kann sein:users
mit seiner Datenbank,clients
mit seiner Datenbank undbot
ohne Datenbank. DierefPath
braucht echte Modellreferenz, wenn nicht, werfen Mongooose einen Fehler.sender._id
kannObjectId
für Benutzer und Clients odernull
für den Bot eingegeben werden.Für die API-Anforderungslogik:
quickReply
Nachricht (Nachrichten-DB muss nur eine schnelle Antwort haben, aber so viele einfache Textnachrichten, wie Sie möchten). Wir verwenden dasfindOneAndUpdate
anstelle vonreplaceOne
oderfindOneAndReplace
.findOneAndUpdate
) und diepopulate
Operation mit dercallback
von jedem aus. Dies ist wichtig , wenn Sie nicht wissen , ob die Verwendungasync/await
,then()
,exec()
odercallback(err, document)
. Weitere Informationen finden Sie im Populate Doc .overwrite
Option und ohne$set
Abfrageoperator.upsert
Option mitteilen .findOneAndUpdate
und für die gespeichert habenpopulate()
.populate
erstellen wir eine benutzerdefinierte dynamische Modellreferenz mit demgetSenderModel
. Wir können die dynamische Mungo-Referenz verwenden, da dassender.type
forbot
kein Mungo-Modell hat. Wir verwenden eine bevölkerungsübergreifende Datenbank mitmodel
undpath
optins.Ich habe viele Stunden damit verbracht, hier und da kleine Probleme zu lösen, und ich hoffe, das wird jemandem helfen! 😃
quelle
Ich hatte einen ganzen blutigen Tag damit zu kämpfen. Keine der oben genannten Lösungen hat funktioniert. Das einzige, was in meinem Fall für ein Beispiel wie das folgende funktioniert hat:
Gehen Sie wie folgt vor: (Angenommen, nach dem Abrufen wird gefüllt - funktioniert aber auch, wenn Sie populate aus der Model-Klasse aufrufen (gefolgt von exec).)
Mit anderen Worten, die äußerste Pfadeigenschaft muss den vollständigen Pfad enthalten. Kein teilweise vollständiger Pfad in Verbindung mit Auffüllungseigenschaften schien zu funktionieren (und die Modelleigenschaft scheint nicht erforderlich zu sein; ist sinnvoll, da sie im Schema enthalten ist). Ich habe einen ganzen verdammten Tag gebraucht, um das herauszufinden! Ich bin mir nicht sicher, warum die anderen Beispiele nicht funktionieren.
(Verwenden von Mongoose 5.5.32)
quelle
Dokumentreferenz entfernen
Das hat bei mir funktioniert.
quelle