Ikke en mongodb
ekspert, men hvis jeg forstår dig rigtigt, ønsker du, at underdokumentets _id-felt indsættes automatisk.
Jeg oprettede threads
db og indsatte derefter den første message
i messages
samling ved hjælp af følgende kommando:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Læg mærke til _id:ObjectId()
Mark. Resultatet er som følger:
Nu hvor jeg har en ObjectId(56...)
, jeg kan opdatere den pågældende post og indsætte flere beskeder til den. Og kommandoen er som følger:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Og ovenstående ville indsætte den nye besked i samlingen. Se nedenstående skærmbilleder:
og endelig efter et par opdateringer ser samlingen ud som følger:
Alle _id-felterne i messages
array genereres automatisk.
Det er måske ikke en god idé at bruge _id
felter af forskellige årsager. Google venligst for flere detaljer om, hvorvidt du skal bruge _id som nøgle til underdokumenter eller ej.
Jeg brugte MongoDB shell version 3.0.6 for kommandoerne.
EDIT 28-01-2016 16:09
Da ovenstående løsning var baseret på MongoDB shell, besluttede jeg at lave en anden test ved hjælp af Node.js driver til MongoDB. Først og fremmest erklærer jeg ObjectID variabel som følger
var ObjectID = require('mongodb').ObjectID;
Jeg vil bruge ObjectID'et med dokument-id'et for den tråd, som meddelelsen skal indsættes i som følger i min update
og findOneAndUpdate
funktionskald
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);
});
});
Har testet begge og fungerer fint. Se skærmbilledet nedenfor: