MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mongoDB :Création d'un ObjectId pour chaque nouvel enfant ajouté au champ de tableau

Pas un mongodb expert mais, si je vous comprends bien, vous souhaitez que le champ _id du sous-document soit inséré automatiquement.

J'ai créé des threads db puis inséré le premier message dans les messages collecte à l'aide de la commande suivante :

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

Remarquez le _id:ObjectId() domaine. Le résultat est le suivant :

Maintenant que j'ai un ObjectId(56...) , je peux mettre à jour cet enregistrement particulier et y insérer plus de messages. Et la commande est la suivante :

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

Et ce qui précède insérerait le nouveau message dans la collection. Voir ci-dessous les captures d'écran :

et enfin après quelques mises à jour la collection se présente comme suit :

Tous les champs _id dans les messages tableau sont générés automatiquement.

Ce n'est peut-être pas une bonne idée d'utiliser _id domaines pour diverses raisons. Veuillez Google pour plus de détails sur l'utilisation ou non de _id comme clé pour les sous-documents.

J'ai utilisé MongoDB shell version 3.0.6 pour les commandes.

EDIT 28-01-2016 16:09

Étant donné que la solution ci-dessus était basée sur le shell MongoDB, j'ai décidé de faire un autre test en utilisant le pilote Node.js pour MongoDB. Tout d'abord, je déclare la variable ObjectID comme suit

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

J'utiliserai l'ObjectID avec l'ID de document du fil dans lequel le message doit être inséré comme suit dans ma update et findOneAndUpdate appels de fonction

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

Testé les deux et fonctionne très bien. Voir la capture d'écran ci-dessous :