2016-06-29 19 views
2

たとえば、次のスキーマを使用してコメントツリーを定義しています。我々は禁止フレーズをtrueにisHiddenフラグを設定するには、親のコメントを更新した場合複数のサブ文書をMongooseで更新しますか?

{ 
    "_id" : ObjectId("id_here"), 
    "parentComment" : "This is my opinion", 
    "isHidden" : false, 
    "comments" : [ 
     { 
      "comment" : "I disagree with your opinion", 
      "isHidden" : false 
     }, 
     { 
      "comment" : "Test Post", 
      "isHidden" : false 
     }, 
     .... 
} 

ので、我々はこのようにそれを行うだろう。

 var userComments = require('mongoose').model("UserComments"); 
     for (let i = 0; i < bannedPhrases.length; i++) { 
      var conditions = { parentComment: bannedPhrases[i] } 
       , update = { isHidden: true} 
       , options = { multi: true }; 

      userComments.update(conditions, update, options, callback); 
     } 

サブ文書「コメント」(スレッドのコメント、複数のエントリ)について考えてみましょう。これらを更新するにはどうすればいいですか?

+0

結果を戻しますか? – jOSe

+0

子コメントのサブ文書をクエリーバックするとどういう意味ですか?私はすべてを出力するためにforeachループ内のツリーをたどって行きます。出力を得ることは問題ではありません。頭痛の原因となる複数のサブ文書を変更しています。 – Eoghan

+0

私はアップデートのお手伝いをすることができます - pymongo、よろしいですか? – jOSe

答えて

4

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

は、我々は文字列の配列である、禁止語句のホールドを持っていると仮定します

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

その後、我々は、bannedPhrasesのいずれかを含むcommentsを持っているすべてのUserCommentsを見つけるために、クエリを実行します。

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

約束を使用することにより、我々は非同期で一緒にアップデートを実行することができます。

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

あなたはBluebird JSは、コードを簡略化することができマングースの約束ライブラリで使用する場合:照会するにはどうすればよい

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 
}); 
関連する問題