sql >> データベース >  >> NoSQL >> MongoDB

Mongooseを介して複数のサブドキュメントを更新しますか?

    私が考えることができる解決策は、ネストされたドキュメントを1つずつ更新することです。

    文字列の配列である禁止されたフレーズを取得したと仮定します:

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

    次に、クエリを実行してすべてのUserCommentsを検索します commentsがあります bannedPhrasesのいずれかを含む 。

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

    promiseを使用することで、非同期で一緒に更新を実行できます:

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

    BluebirdJS を使用する場合 Mongooseのpromiseライブラリであるため、コードを簡略化できます:

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


    1. redis.confを保存して終了する方法は?

    2. MongoDB C#ドライバー-バインディングのフィールドを無視する

    3. Mongooseを使用してMongoDBの多くのレコードを更新するための正しいアプローチは何ですか

    4. マングース-ObjectIdの配列でPopulateを使用する