8
votes

Mongodb met à jour plusieurs enregistrements de tableau

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: xxx

J'essaie d'exécuter la requête suivante: xxx

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.


0 commentaires

4 Réponses :


6
votes

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


0 commentaires

20
votes

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


4 commentaires

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



-1
votes

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


0 commentaires

1
votes

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) {
  // ...
});
  • soyez conscient que l'IDE n'accepte pas la syntaxe, mais vous pouvez l'ignorer. Li> ul> p>


0 commentaires