J'ai récemment commencé à utiliser MongoDB et j'ai une question concernant la mise à jour des tableaux dans un document.
J'ai une structure comme ceci: J'essaie d'exécuter la requête suivante: p> Le problème est qu'il met à jour tous les documents , mais il ne met à la mise à jour que le premier élément de tableau dans chaque document. Y a-t-il un moyen de mettre à jour tous les éléments de tableau ou je devrais essayer de le faire manuellement?
Merci. P> p>
4 Réponses :
Une solution pourrait créer une fonction à utiliser avec une pourbeach et la valoriser (il fonctionne donc rapidement). En supposant que votre collection est "article", vous pouvez exécuter ce qui suit:
var runUpdate = function(){
db.article.find({"comments.user":"test").forEach( function(article) {
for(var i in article.comments){
article.comments[i].avatar = 'new_avatar.jpg';
}
db.article.save(article);
});
};
db.eval(runUpdate);
Vous ne pouvez pas modifier plusieurs éléments de tableau dans une seule opération de mise à jour. Ainsi, vous devrez répéter la mise à jour afin de migrer des documents qui nécessitent plusieurs éléments de matrice à modifier. Vous pouvez le faire en itérant à travers chaque document de la collection, appliquant à plusieurs reprises une mise à jour avec ELEMMatch CODE> jusqu'à ce que le document ait toutes ses commentaires pertinents remplacés, par exemple:
db.collection.find().forEach( function(doc) {
do {
db.collection.update({_id: doc._id,
comments:{$elemMatch:{user:"test",
avatar:{$ne:"new_avatar.jpg"}}}},
{$set:{"comments.$.avatar":"new_avatar.jpg"}});
} while (db.getPrevError().n != 0);
})
Merci d'avoir répondu. Eh bien, Depuis que Mongo n'a pas de jointures, je voudrais faire du système de blog avec des commentaires, et j'aimerais montrer à tous les utilisateurs avatar à côté de ses commentaires. Toute suggestion comment dois-je structurer mon schéma?
Conceptuellement, vous auriez besoin de stocker un utilisateur => Avatar Carte quelque part. Vous pouvez stocker l'avatar de chaque utilisateur dans le document utilisateur (dans la collection de vos utilisateurs) ou, vous pouvez stocker une carte utilisateur => Avatar pour les commentateurs d'une entrée de blog donnée dans un champ de ce document de ce blog. Voir docs.mongodb.org/manual/applications/database-ferences pour Un traitement léger de la normalisation dans MongoDB et docs.mongodb.org/manual/ Utilisez-les-cas / stockage-commentaires pour un "commentaires utilisateur" Utilisez une analyse de cas.
Oui, j'ai compris cette solution juste avant de voir votre réponse. Quoi qu'il en soit, merci beaucoup @jason.
TypeError: db.getpreverror n'est pas une fonction
On dirait que vous pouvez le faire:
db.yourCollection.update({"comments.user":"test"},{$set:{"comments.0.avatar": "new_avatar.jpg", "comments.1.avatar": "new_avatar.jpg", etc...})
Si vous connaissez les index que vous souhaitez mettre à jour, vous pouvez le faire sans problème:
var update = { $set: {} };
for (var i = 0; i < indexesToUpdate.length; ++i) {
update.$set[`comments.${indexesToUpdate[i]}. avatar`] = "new_avatar.jpg";
}
Comments.update({ "comments.user":"test" }, update, function(error) {
// ...
});