No es un mongodb
experto pero, si te entiendo bien, deseas que el campo _id del subdocumento se inserte automáticamente.
Creé threads
db y luego insertó el primer message
en los messages
colección usando el siguiente comando:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Observe el _id:ObjectId()
campo. El resultado es el siguiente:
Ahora que tengo un ObjectId(56...)
, puedo actualizar ese registro en particular e insertarle más mensajes. Y el comando es el siguiente:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Y lo anterior insertaría el nuevo mensaje en la colección. Vea las siguientes capturas de pantalla:
y finalmente, después de algunas actualizaciones, la colección tiene el siguiente aspecto:
Todos los campos _id en los messages
matriz se generan automáticamente.
Puede que no sea una buena idea usar _id
campos por diversas razones. Busque en Google más detalles sobre si usar _id como clave para los subdocumentos o no.
Usé MongoDB shell versión 3.0.6 para los comandos.
EDITAR 28-01-2016 16:09
Dado que la solución anterior se basó en el shell de MongoDB, decidí hacer otra prueba con el controlador Node.js para MongoDB. En primer lugar, declaro la variable ObjectID de la siguiente manera
var ObjectID = require('mongodb').ObjectID;
Usaré el ID de objeto con la identificación del documento del hilo en el que se debe insertar el mensaje de la siguiente manera en mi update
y findOneAndUpdate
llamadas de función
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);
});
});
Ambos probados y funcionan bien. Vea la captura de pantalla a continuación: