2017-03-27 112 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" 
} 
} 

我試過了,但它不能同時工作,它只是用於更改第一個嵌入式文檔。這裏是我的代碼:

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

Omg它的工作原理,但如何在PHP中實現? db-> chat-> find(array(「_ id」=>「2」))然後呢? –

+0

不客氣。很抱歉,但我無法幫助您瞭解PHP。必須有一種方法可以在mongodb php庫中使用該查詢。 –

+0

@哈桑查找條件應該是:{「_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 
     } 
    }); 
    });