我一直在嘗試更新這個集合的物件。下面是集合。尋找服務器 3.6 版本。
這里的問題是需要將類名從 "HISTORY" 更新為 "HISTORY_NEW" 。需要做的,對于班上的一些學生。需要一個查詢,該查詢將選擇學生集合中包含“HISTORY”類的所有學生記錄并更新為“HISTORY_NEW”。我有大約 30,000 條記錄,但沒有獲得批量更新方法
{
"_id" : ObjectId("611f90aa43f77a728879c395"),
"studentId" : "stu1",
"classes" : {
"History" : {
"TeacherName" : "T1",
"Marks" : [
{
"Internal": 15
}
]
},
"Geography" : {
"TeacherName" : "T2",
"Marks" : [
{
"Internal" : 20
}
]
}
},
"updateDate" : ISODate("2021-10-12T11:40:47.156Z")
}
這是我期待的最終結果
{
"_id" : ObjectId("611f90aa43f77a728879c395"),
"studentId" : "stu1",
"classes" : {
"HISTORY_NEW" : {
"TeacherName" : "T1",
"Marks" : [
{
"Internal": 15
}
]
},
"Geography" : {
"TeacherName" : "T2",
"Marks" : [
{
"Internal" : 20
}
]
}
},
"updateDate" : ISODate("2021-10-12T11:40:47.156Z")
}
.或者甚至可以通過上面的那種集合或通過代碼路線?
到目前為止,這就是我所擁有的,沒有任何成功
獲取所有學生 ID,然后更新 Class name 。但這也不起作用,并且不認為將 DB 更新 30,000 次是明智的。
var studentIds =[];
db.studentSubject.find({"classes.History":{$exists:true}}).forEach(function(u) { studentIds.push(u.studentId) })
studentIds.forEach(function(studentId) {
var result;
try {
result =db.studentSubject.updateOne(
{studentId:studentId}
,{ $set : {"classes.History": "HISTORY_NEW",}},
{ upsert: false});
} catch (e)
{ print(e);}
});
uj5u.com熱心網友回復:
從您的場景來看,您需要$rename操作員。
正如評論中所討論的,您不需要獲取每個檔案來獲取studentId然后傳遞它來更新每個檔案。只需通過檢查檔案具有classes.History欄位來批量更新。
db.collection.update({
"classes.History": {
$exists: true
}
},
{
$rename: {
"classes.History": "classes.HISTORY_NEW"
}
},
{
upsert: false,
multi: true
})
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350920.html
