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 :