我一直在尝试更新此集合的Object。以下是该系列。正在查找Server 3.6版本。
这里的问题是需要从"更新类名;历史;至";历史_新";。需要做的,对于班上的一些学生来说。需要一个查询,该查询将选择学生集合中的所有学生记录;历史;类,并将它们更新为";历史_新";。我有大约30000条记录,但没有得到批量更新方法。
{
"_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,然后更新类名。但这也不起作用,并且认为更新DB 30000次是不明智的。
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);
}
});
在您的场景中,您需要$rename
运算符。
正如评论中所讨论的,您不需要获取每个文档来获得studentId
,然后传递它来更新每个文档。只是通过检查文档是否有classes.History
字段进行批量更新。
db.collection.update({
"classes.History": {
$exists: true
}
},
{
$rename: {
"classes.History": "classes.HISTORY_NEW"
}
},
{
upsert: false,
multi: true
})
Mongo游乐场示例