sql >> Base de Datos >  >> NoSQL >> MongoDB

mongoDB:creación de un ObjectId para cada nuevo niño agregado al campo de matriz

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: