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: