MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren mehrerer Teildokumente über Mongoose?

Die Lösung, die mir einfällt, besteht darin, das verschachtelte Dokument einzeln zu aktualisieren.

Angenommen, wir haben die verbotenen Phrasen, die ein Array von Strings sind:

var bannedPhrases = ["censorship", "evil"]; // and more ...

Dann führen wir eine Abfrage durch, um alle UserComments zu finden die comments hat die einen der bannedPhrases enthalten .

UserComments.find({"comments.comment": {$in: bannedPhrases }});

Durch die Verwendung von Promises können wir die Aktualisierung gemeinsam asynchron durchführen:

UserComments.find({"comments.comment": {$in: bannedPhrases }}, {"comments.comment": 1})
  .then(function(results){
    return results.map(function(userComment){

       userComment.comments.forEach(function(commentContainer){
         // Check if this comment contains banned phrases
         if(bannedPhrases.indexOf(commentContainer.comment) >= 0) {
           commentContainer.isHidden = true;
         }
       });

       return userComment.save();
    });
  }).then(function(promises){
     // This step may vary depending on which promise library you are using
     return Promise.all(promises); 
  });

Wenn Sie Bluebird JS verwenden Mongoose's Promise Library ist, könnte der Code vereinfacht werden:

UserComments.find({"comments.comment": {$in: bannedPhrases}}, {"comments.comment": 1})
    .exec()
    .map(function (userComment) {

        userComment.comments.forEach(function (commentContainer) {
            // Check if this comment contains banned phrases
            if (bannedPhrases.indexOf(commentContainer.comment) >= 0) {
                commentContainer.isHidden = true;
            }
        });

        return userComment.save();
    }).then(function () {
    // Done saving
});