Não é um
mongodb expert mas, se entendi corretamente, você deseja que o campo _id do subdocumento seja inserido automaticamente. Eu criei
threads db e, em seguida, inseriu a primeira message nas messages coleção usando o seguinte comando:db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Observe o
_id:ObjectId() campo. O resultado é o seguinte:
Agora que tenho um
ObjectId(56...) , posso atualizar esse registro específico e inserir mais mensagens nele. E o comando é o seguinte:db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
E o acima inseriria a nova mensagem na coleção. Veja abaixo as capturas de tela:
e, finalmente, após algumas atualizações, a coleção fica assim:
Todos os campos _id nas
messages array são gerados automaticamente. Pode não ser uma boa ideia usar
_id campos por vários motivos. Consulte o Google para obter mais detalhes sobre usar ou não _id como chave para subdocumentos. Eu usei o MongoDB shell versão 3.0.6 para os comandos.
EDITAR 28-01-2016 16:09
Como a solução acima foi baseada no shell do MongoDB, decidi fazer outro teste usando o driver Node.js para o MongoDB. Primeiro de tudo, eu declaro a variável ObjectID da seguinte forma
var ObjectID = require('mongodb').ObjectID;
Usarei o ObjectID com id do documento do thread no qual a mensagem deve ser inserida conforme segue no meu
update e findOneAndUpdate chamadas de função 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);
});
});
Testei os dois e funciona perfeitamente. Veja a imagem abaixo: