MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongoDB :Erstellen einer ObjectId für jedes neue untergeordnete Element, das dem Array-Feld hinzugefügt wird

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: