Geen mongodb
expert, maar als ik u goed begrijp, wilt u dat het _id-veld van het subdocument automatisch wordt ingevoegd.
Ik heb threads
gemaakt db en vervolgens het eerste message
inserted ingevoegd in de messages
verzameling met het volgende commando:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Let op de _id:ObjectId()
veld. Het resultaat is als volgt:
Nu ik een ObjectId(56...)
. heb , kan ik dat specifieke record bijwerken en er meer berichten aan toevoegen. En het commando is als volgt:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
En het bovenstaande zou het nieuwe bericht in de verzameling invoegen. Zie onderstaande screenshots:
en uiteindelijk ziet de collectie er na een paar updates als volgt uit:
Alle _id-velden in de messages
array worden automatisch gegenereerd.
Het is misschien geen goed idee om _id
. te gebruiken velden om verschillende redenen. Gebruik Google voor meer informatie over het al dan niet gebruiken van _id als sleutel voor subdocumenten.
Ik gebruikte MongoDB shell versie 3.0.6 voor de commando's.
BEWERK 28-01-2016 16:09
Omdat de bovenstaande oplossing gebaseerd was op de MongoDB-shell, besloot ik nog een test uit te voeren met het Node.js-stuurprogramma voor MongoDB. Allereerst declareer ik de ObjectID-variabele als volgt
var ObjectID = require('mongodb').ObjectID;
Ik zal de ObjectID met document-ID van de thread waarin het bericht moet worden ingevoegd als volgt gebruiken in mijn update
en findOneAndUpdate
functie-aanroepen
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);
});
});
Beiden getest en werken prima. Zie de onderstaande schermafbeelding: