2017-03-27 3 views
0

모든 임베디드 문서를 업데이트하고 싶습니다. 내 문서는 다음과 같습니다.여러 중첩/포함 문서 mongodb를 업데이트하는 방법은 무엇입니까?

{ 
"_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":"pending" 
}, 
{ "sender":"foo", 
"message":"Are you okay?", 
"status":"pending" 
}, 
{ "sender":"someone", 
"message":"Where are you?", 
"status":"pending" 
} 
} 

시도했지만 동시에 작동하지 않을 수 있습니다. 첫 번째 포함 된 문서를 변경하기 위해 작동합니다. 나는이 문서가 이렇게 될 업데이트되어 원하는 그것뿐만 동시에 1 개 과정에서 변경해야

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

:

{ 
"_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

Omg 그것은 선생님,하지만 어떻게 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 
     } 
    }); 
    });