注意:請使用mongodb shell執行代碼。更新/刪除MongoDB集合中的子文檔
比方說,我有一個學生的文件,如下
{
"_id" : 4,
"grades" : [
{
"grade" : 80,
"mean" : 75,
"std" : 8
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 95,
"std" : 6
},
{
"grade" : 90,
"mean" : 85,
"std" : 5
}
]
}
我們有2個問題:
問題1:可以說你想與_id = 4個& &等級來更新所有的子文檔。等級= 85 & &等級.std = 5,與std = 6你會寫如下
db.students.update({'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } });
分
現在,如果你執行上面的語句多次(3次),那麼最好就應該更新第二,第三子文檔
但最後一個子文件也得到更新東陽有STD = 5的比賽,但我們給出的條件爲$和不是$或,那麼最後一個文件如何得到更新?
問題2: 現在讓我們假設你想刪除與查詢條件相匹配的子文檔本身。 我嘗試下面的語句
db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})
因爲$未設置會把空的子文檔/陣列的情況下,如何解決這個問題?
如何在您的mongodb控制檯中複製?
db.students.insert({ "_id" : 4, "grades" : [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 95, std: 6 }, { grade: 90, mean: 85, std: 5 } ] });
感謝您的第一個問題的答案,我已經嘗試使用@drmirror答案。 $ pull將在子文檔中設置爲null,那麼我必須執行2更新語句 一個用於更新爲空, 另一個用於從子文檔中刪除null。 一個更新語句可能嗎? –
在2.4中拉取子文件而不是設置爲空。 – Ross
非常抱歉,我的壞...它的工作...非常感謝 –