Не е mongodb
експерт, но ако съм ви разбрал правилно, искате полето _id на поддокумента да се вмъкне автоматично.
Създадох threads
db и след това вмъкна първото message
в messages
колекция с помощта на следната команда:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Забележете _id:ObjectId()
поле. Резултатът е следният:
Сега, когато имам ObjectId(56...)
, мога да актуализирам този конкретен запис и да вмъкна още съобщения в него. И командата е както следва:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
И горното ще вмъкне новото съобщение в колекцията. Вижте екранните снимки по-долу:
и накрая след няколко актуализации колекцията изглежда по следния начин:
Всички полета _id в messages
масивът се генерира автоматично.
Може да не е добра идея да използвате _id
полета по различни причини. Моля, Google за повече подробности дали да използвате _id като ключ за поддокументи или не.
Използвах MongoDB shell версия 3.0.6 за командите.
РЕДАКТИРАНЕ 28-01-2016 16:09
Тъй като горното решение беше базирано на обвивката на MongoDB, реших да направя друг тест, използвайки драйвер Node.js за MongoDB. На първо място, декларирам променлива ObjectID, както следва
var ObjectID = require('mongodb').ObjectID;
Ще използвам ObjectID с идентификатора на документа на нишката, в която трябва да се вмъкне съобщението, както следва в моята update
и findOneAndUpdate
извиквания на функции
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);
});
});
Тествано и двете и работят добре. Вижте екранната снимка по-долу: