2017-03-27 11 views
0

私はすべての埋め込みドキュメントを更新したいと思っています。ここに私の文書があります:複数のネスト/埋め込みドキュメントmongodbを更新するにはどうすればよいですか?

私は試しましたが、同時に動かすことはできませんでしたが、最初の埋め込み文書を変更するだけで動作します。ここに私のコードは次のとおりです。

db.chat.update({"_id":"2", "chat.sender":"foo"},{$set{"chat.$.status":"sent"}},{multi:true}) 

私は文書がこのように更新されると、それはのように同時に1つのプロセスで変更されている必要がありますしたい:

{ 
"_id":1, 
"chat":[ 
{ "sender":"bar", 
"message":"Hi", 
"status":"pending" 
}, 
{ "sender":"bar", 
"message":"How are you?", 
"status":"pending" 
} 
} 
{ 
"_id":2, 
"chat":[ 
{ "sender":"foo", 
"message":"Hello", 
"status":"sent" 
}, 
{ "sender":"foo", 
"message":"Are you okay?", 
"status":"sent" 
}, 
{ "sender":"someone", 
"message":"Where are you?", 
"status":"pending" 
} 
} 

あなたはこの問題を解決する方法を知っている場合は、私を助けてください...

答えて

0

これはあなたが探しているものです。

db.chat.find({ "_id":2 }) 
    .forEach(function (doc) { 
    doc.chat.forEach(function (ch) { 
     if (ch.sender === "foo") { 
     ch.status="sent"; 
     } 
    }); 
    db.chat.save(doc); 
    }); 
+0

私はそれがどのようにPHPで実装するのですか? db-> chat-> find(array( "_ id" => "2"))そして? –

+0

ようこそ。申し訳ありませんが、PHPについてお手伝いできません。 mongodb PHPライブラリでそのクエリを使用する方法がなければなりません。 –

+0

@ Hasanが条件を見つける必要があります:{"_id":2}、あなたのansを編集してください。 – radhakrishnan

0

と思いますが、これが必要です。このようにしてみてください。

db.chat.find({"_id":2, 
    chat: { 
     $exists: true 
    } 
}).forEach(function(myDoc) { 
    var child = myDoc.chat; 
    for (var i = 0; i < child.length; i++) { 
     var ob = child[i]; 
     if (ob.sender == "foo") { 
      ob.status = "sent"; 
      child[i] = ob; 
     } 
    } 
    db.chat.update({ 
     _id: myDoc._id 
    }, { 
     $set: { 
      chat: child 
     } 
    }); 
    }); 
関連する問題