Keine mongodb
Experte, aber wenn ich Sie richtig verstehe, möchten Sie, dass das Feld _id des Filialdokuments automatisch eingefügt wird.
Ich habe threads
erstellt db und fügte dann die erste message
ein in den messages
Sammlung mit dem folgenden Befehl:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Beachten Sie die _id:ObjectId()
Feld. Das Ergebnis lautet wie folgt:
Jetzt habe ich eine ObjectId(56...)
, kann ich diesen bestimmten Datensatz aktualisieren und ihm weitere Nachrichten hinzufügen. Und der Befehl lautet wie folgt:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Und das Obige würde die neue Nachricht in die Sammlung einfügen. Siehe folgende Screenshots:
und schließlich sieht die Sammlung nach einigen Aktualisierungen wie folgt aus:
Alle _id-Felder in den messages
Array werden automatisch generiert.
Es ist möglicherweise keine gute Idee, _id
zu verwenden Felder aus verschiedenen Gründen. Bitte Google für weitere Details darüber, ob _id als Schlüssel für Unterdokumente verwendet werden soll oder nicht.
Ich habe MongoDB-Shell-Version 3.0.6 verwendet für die Befehle.
BEARBEITEN 28.01.2016 16:09
Da die obige Lösung auf der MongoDB-Shell basierte, entschied ich mich für einen weiteren Test mit dem Node.js-Treiber für MongoDB. Zunächst deklariere ich die ObjectID-Variable wie folgt
var ObjectID = require('mongodb').ObjectID;
Ich werde die ObjectID mit der Dokument-ID des Threads verwenden, in den die Nachricht eingefügt werden soll, wie folgt in meinem update
und findOneAndUpdate
Funktionsaufrufe
app.get('/insertNewMessage', function(req, res) {
db.collection("messages").findOneAndUpdate({
_id: new ObjectID('56aa3554e90911b64c36a424')
}, {
$push: {
messages: {
_id: new ObjectID(),
message: "From NodeJS with <3 using findOneAndUpdate.Bye."
}
}
}, function(err, result) {
if (err)
res.json(err);
else
res.json(result);
});
});
Habe beides getestet und funktioniert einwandfrei. Siehe Screenshot unten: