Inte en mongodb
expert men om jag förstår dig rätt vill du att fältet _id i underdokumentet ska infogas automatiskt.
Jag skapade threads
db och infogade sedan det första message
i messages
samling med följande kommando:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Lägg märke till _id:ObjectId()
fält. Resultatet är följande:
Nu när jag har en ObjectId(56...)
, jag kan uppdatera just den posten och infoga fler meddelanden till den. Och kommandot är som följer:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Och ovanstående skulle infoga det nya meddelandet i samlingen. Se nedanstående skärmdumpar:
och slutligen efter några uppdateringar ser samlingen ut som följer:
Alla _id-fält i messages
array genereras automatiskt.
Det kanske inte är en bra idé att använda _id
fält av olika anledningar. Vänligen Google för mer information om huruvida _id ska användas som nyckel för underdokument eller inte.
Jag använde MongoDB-skalversion 3.0.6 för kommandona.
REDIGERA 2016-01-28 16:09
Eftersom ovanstående lösning var baserad på MongoDB-skal, bestämde jag mig för att göra ett nytt test med Node.js-drivrutinen för MongoDB. Först och främst deklarerar jag ObjectID-variabel enligt följande
var ObjectID = require('mongodb').ObjectID;
Jag kommer att använda ObjectID med dokument-id för tråden som meddelandet ska infogas i enligt följande i min update
och findOneAndUpdate
funktionsanrop
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);
});
});
Testade båda och fungerar bra. Se skärmdumpen nedan: