MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongoDB:creazione di un ObjectId per ogni nuovo figlio aggiunto al campo dell'array

Non un mongodb esperto ma, se ho capito bene, desideri che il campo _id del documento secondario venga inserito automaticamente.

Ho creato threads db e quindi inserito il primo message nei messages raccolta utilizzando il seguente comando:

db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]}); 

Nota il _id:ObjectId() campo. Il risultato è il seguente:

Ora che ho un ObjectId(56...) , posso aggiornare quel particolare record e inserirvi più messaggi. E il comando è il seguente:

db.messages.update({"_id":ObjectId("56...")}, 
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});

E quanto sopra inserirebbe il nuovo messaggio nella raccolta. Vedi sotto gli screenshot:

e infine, dopo alcuni aggiornamenti, la raccolta si presenta come segue:

Tutti i campi _id nei messages gli array vengono generati automaticamente.

Potrebbe non essere una buona idea usare _id campi per vari motivi. Si prega di Google per maggiori dettagli sull'utilizzo o meno di _id come chiave per i documenti secondari.

Ho usato MongoDB shell versione 3.0.6 per i comandi.

EDIT 28-01-2016 16:09

Poiché la soluzione di cui sopra era basata sulla shell MongoDB, ho deciso di fare un altro test utilizzando il driver Node.js per MongoDB. Prima di tutto, dichiaro la variabile ObjectID come segue

var ObjectID = require('mongodb').ObjectID;

Userò l'ObjectID con ID documento del thread in cui inserire il messaggio come segue nel mio update e findOneAndUpdate chiamate di funzione

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);
    });
});

Testati entrambi e funzionano bene. Vedi lo screenshot qui sotto: