Ich kann das Erstellerfeld nicht manuell oder automatisch in ein neu gespeichertes Objekt einfügen. Die einzige Möglichkeit, die ich finden kann, besteht darin, die bereits vorhandenen Objekte erneut abzufragen, was ich gerne tun würde.
Dies ist das Setup:
var userSchema = new mongoose.Schema({
name: String,
});
var User = db.model('User', userSchema);
var bookSchema = new mongoose.Schema({
_creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
description: String,
});
var Book = db.model('Book', bookSchema);
Hier ziehe ich an meinen Haaren
var user = new User();
user.save(function(err) {
var book = new Book({
_creator: user,
});
book.save(function(err){
console.log(book._creator); // is just an object id
book._creator = user; // still only attaches the object id due to Mongoose magic
console.log(book._creator); // Again: is just an object id
// I really want book._creator to be a user without having to go back to the db ... any suggestions?
});
});
BEARBEITEN: Der neueste Mungo hat dieses Problem behoben und die Funktion zum Auffüllen hinzugefügt. Siehe die neu akzeptierte Antwort.
creator.profile
Für den Fall, dass noch jemand danach sucht.
Mongoose 3.6 hat viele coole Funktionen zum Auffüllen eingeführt:
oder:
Weitere Informationen finden Sie unter : https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population
Auf diese Weise würden Sie den Benutzer jedoch weiterhin abfragen.
Ein kleiner Trick, um dies ohne zusätzliche Fragen zu erreichen, wäre:
quelle
book._creator = user;
nachdem diesave()
die einzig richtige Antwort unter allen aktuellen Antworten ist, benötigen alle anderen Antworten eine zusätzliche Abfrage.Die Lösung für mich war
execPopulate
, so zu verwendenquelle
Lösung, die ein Versprechen zurückgibt (keine Rückrufe):
Verwenden Sie Document # populate
Mögliche Implementierung
Lesen Sie mehr über Dokument Bevölkerung hier .
quelle
Nur um es näher zu erläutern und ein weiteres Beispiel zu geben, das mir geholfen hat. Dies kann denjenigen helfen, die teilweise ausgefüllte Objekte nach dem Speichern abrufen möchten. Die Methode ist auch etwas anders. Verbrachte mehr als ein oder zwei Stunden damit, nach dem richtigen Weg zu suchen.
quelle
Ich dachte, ich würde das ergänzen, um die Dinge für komplette Noobs wie mich zu klären.
Was massiv verwirrend ist, wenn Sie nicht aufpassen, ist, dass es drei sehr unterschiedliche Methoden zum Auffüllen gibt. Sie sind Methoden für verschiedene Objekte (Modell vs. Dokument), nehmen unterschiedliche Eingaben entgegen und geben unterschiedliche Ausgaben (Dokument vs. Versprechen).
Hier sind sie für diejenigen, die verblüfft sind:
Document.prototype.populate ()
Siehe vollständige Dokumente.
Dieser bearbeitet Dokumente und gibt ein Dokument zurück. Im ursprünglichen Beispiel würde es so aussehen:
Da es Dokumente bearbeitet und ein Dokument zurückgibt, können Sie sie wie folgt verketten:
Aber sei nicht albern wie ich und versuche das:
Denken Sie daran: Document.prototype.populate () gibt ein Dokument zurück, das ist also Unsinn. Wenn Sie ein Versprechen wollen, brauchen Sie ...
Document.prototype.execPopulate ()
Siehe vollständige Dokumente.
Dieser bearbeitet Dokumente, ABER er gibt ein Versprechen zurück, das in das Dokument aufgelöst wird. Mit anderen Worten, Sie können es folgendermaßen verwenden:
Das ist besser. Endlich gibt es ...
Model.populate ()
Siehe vollständige Dokumente.
Dieser arbeitet an Modellen und gibt ein Versprechen zurück. Es wird daher etwas anders verwendet:
Hoffe, das hat einigen anderen Newcomern geholfen.
quelle
Leider ist dies ein langjähriges Problem mit Mungos, von dem ich glaube, dass es noch nicht gelöst ist:
https://github.com/LearnBoost/mongoose/issues/570
Was Sie tun können, ist, dafür Ihren eigenen benutzerdefinierten Getter / Setter zu schreiben (und in einer separaten Eigenschaft real zu setzen
_customer
). Beispielsweise:HINWEIS: Ich habe es nicht getestet und es funktioniert möglicherweise seltsam mit
.populate
und beim Festlegen der reinen ID.quelle
Mungo 5.2.7
Das funktioniert bei mir (nur viel Kopfschmerzen!)
quelle
Wahrscheinlich etw. mögen
Wäre der schönste und am wenigsten problematische Weg, um diese Arbeit zu machen (mit Bluebird-Versprechungen).
quelle
Am Ende haben wir einige curry-fähige Promise-Funktionen geschrieben, in denen Sie Ihre Schema-, query_adapter-, data_adapter-Funktionen deklarieren und Zeichenfolgen im Voraus füllen. Für eine kürzere / einfachere Implementierung einfacher.
Es ist wahrscheinlich nicht sehr effizient, aber ich fand das Ausführungsbit ziemlich elegant.
Github-Datei: curry_Promises.js
Deklaration
Ausführung
quelle