Ne mongodb
expert, ale pokud vám dobře rozumím, přejete si, aby pole _id vnořeného dokumentu bylo vloženo automaticky.
Vytvořil jsem threads
db a poté vložil první message
ve messages
sběr pomocí následujícího příkazu:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Všimněte si _id:ObjectId()
pole. Výsledek je následující:
Nyní, když mám ObjectId(56...)
, mohu aktualizovat tento konkrétní záznam a vložit do něj další zprávy. A příkaz je následující:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
A výše uvedené by vložilo novou zprávu do kolekce. Viz níže uvedené snímky obrazovky:
a nakonec po několika aktualizacích kolekce vypadá následovně:
Všechna pole _id ve messages
pole se generují automaticky.
Možná není dobrý nápad použít _id
pole z různých důvodů. Další podrobnosti o tom, zda použít _id jako klíč pro vnořené dokumenty, získáte od Googlu.
Použil jsem MongoDB shell verze 3.0.6 pro příkazy.
EDITACE 28. 1. 2016 16:09
Protože výše uvedené řešení bylo založeno na prostředí MongoDB, rozhodl jsem se provést další test pomocí ovladače Node.js pro MongoDB. Nejprve deklaruji proměnnou ObjectID následovně
var ObjectID = require('mongodb').ObjectID;
Použiji ObjectID s ID dokumentu vlákna, do kterého má být zpráva vložena, jak je uvedeno v mé update
a findOneAndUpdate
volání funkcí
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);
});
});
Oboje vyzkoušeno a funguje dobře. Viz snímek obrazovky níže: