Ich habe SO ein gutes Stück nach der Antwort gesucht, aber ich bin mir sicher, dass ich nicht die richtigen Worte gefunden habe, um zu beschreiben, wonach ich suche.
Grundsätzlich habe ich eine Mongodb-Sammlung namens 'people'. Das Schema für diese Sammlung lautet wie folgt:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Jetzt habe ich eine sehr einfache Express-Anwendung, die eine Verbindung zur Datenbank herstellt und erfolgreich "Personen" mit einem leeren Freundes-Array erstellt.
An einer sekundären Stelle in der Anwendung befindet sich ein Formular zum Hinzufügen von Freunden. Das Formular enthält Vorname und Nachname sowie POSTs mit dem Namensfeld, um auch auf das richtige Personenobjekt zu verweisen.
Es fällt mir schwer, ein neues Friend-Objekt zu erstellen und es dann in das Friends-Array zu "verschieben".
Ich weiß, dass ich, wenn ich dies über die Mongo-Konsole mache, die Update-Funktion mit $ push als zweites Argument nach den Suchkriterien verwende, aber ich kann anscheinend keinen geeigneten Weg finden, um Mungo dazu zu bringen, dies zu tun.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
UPDATE: Also war Adrians Antwort sehr hilfreich. Folgendes habe ich getan, um mein Ziel zu erreichen.
In meiner Datei app.js habe ich mithilfe eine temporäre Route festgelegt
app.get('/addfriend', users.addFriend);
wo in meiner Datei users.js habe ich
exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};
Antworten:
Vorausgesetzt,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Sie haben zwei Möglichkeiten:
Aktualisieren Sie das Modell im Arbeitsspeicher und speichern Sie es (einfaches Javascript array.push):
oder
Ich versuche immer, die erste Option zu wählen, wenn dies möglich ist, da sie mehr von den Vorteilen des Mungos (Haken, Validierung usw.) berücksichtigt.
Wenn Sie jedoch viele gleichzeitige Schreibvorgänge ausführen, werden Sie auf Rennbedingungen stoßen, bei denen Sie böse Versionsfehler haben, die Sie daran hindern, jedes Mal das gesamte Modell zu ersetzen und den zuvor hinzugefügten Freund zu verlieren. Gehen Sie also nur zu ersteren, wenn es absolut notwendig ist.
quelle
update
Funktion, während es NICHT IST sicher ein Dokument zu finden, ändern Sie es im Speicher und dann den Anruf.save()
auf dem Dokument Methode. Wenn ich sage, dass ein Vorgang "sicher" ist, bedeutet dies, dass selbst wenn eine, zwei oder 50 Änderungen auf ein Dokument angewendet werden, alle erfolgreich angewendet werden und das Verhalten der Aktualisierungen wie erwartet ist. Im Wesentlichen ist die In-Memory-Manipulation unsicher, da Sie möglicherweise an einem veralteten Dokument arbeiten. Beim Speichern gehen also Änderungen verloren, die nach dem Abrufschritt aufgetreten sind.let done = function(err, result) { // this runs after the mongoose operation }
Die obige Antwort erfüllt alle Anforderungen, aber ich habe sie durch die folgenden Schritte zum Laufen gebracht
quelle
Verwenden Sie
$push
diese Option, um das Dokument zu aktualisieren und einen neuen Wert in ein Array einzufügen.finden:
Ergebnis für find:
aktualisieren:
Ergebnis für Update:
quelle
Eine einfache Möglichkeit, dies zu tun, besteht darin, Folgendes zu verwenden:
quelle
In meinem Fall habe ich das getan
quelle
Ich bin auch auf dieses Problem gestoßen. Meine Lösung bestand darin, ein untergeordnetes Schema zu erstellen. Unten finden Sie ein Beispiel für Ihre Modelle.
---- Personenmodell
*** Wichtig: SingleFriend.schema -> Stellen Sie sicher, dass für das Schema Kleinbuchstaben verwendet werden
--- Kinderschema
quelle