我正在尝试对一个集合(超过一百万个文档)进行大规模更新。因此,为了做到这一点,我将创建要迭代和更新的批处理,但是10分钟后会显示默认超时。
错误:getMore命令失败:{ “ ok”:0, “ errmsg”:“未找到光标,光标ID:47299886647”, “代码”:43 }
我在这个论坛上读到了有关此错误的信息,一种解决方案是创建一批文档,以便为每个批次创建一个新的游标,并避免超时,但是由于某种原因,它无法正常工作。
我在这里共享脚本正在使用:
db.Customers_UAT.aggregate([
{ $match: {"db":{"$exists": true, "$ne": null}}},
{
$project:{
"_id": 1,
firstName: "$fn",
email: "$eml",
db: "$db",
year: {
$cond:{
if: {$eq: [null, "$db"]},
then: "null",
else: { $year: "$db"}
}
},
month: {
$cond:{
if: {$eq: [null, "$db"]},
then: "null",
else: { $month: "$db"}
}
},
day: {
$cond:{
if: {$eq: [null, "$db"]},
then: "null",
else: { $dayOfMonth: "$db"}
}
}
}
}
],
{
allowDiskUse:true,
cursor:{batchSize: 500}
}).forEach(function(doc){
if(doc != null)
{
if(doc.year != "null" || doc.year != 1900){
doc.year = 1900;
var date = new Date(doc.year, doc.month-1, doc.day);
UpdateBirthdate(doc._id, date);
}
}
})
这是UpdateBirthdate函数:
function UpdateBirthdate(id, birthdate){
db.Customers_UAT.update(
{"_id": id},
{
$set: {
"db" : birthdate}
}
)
};
基本上,此脚本检索出生日期并将其分为日,月和年,以便能够在同一年更新每个文档。
如您所见,我将设置一个较低的batchSize数字(500)。
我在batchSize声明上做错了吗?我正在使用MongoDB Shell 3.2.10
任何建议将不胜感激。