为什么在创建一批文档后给我一个光标超时?

时间:2018-09-19 04:49:27

标签: mongodb robo3t

我正在尝试对一个集合(超过一百万个文档)进行大规模更新。因此,为了做到这一点,我将创建要迭代和更新的批处理,但是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

任何建议将不胜感激。

0 个答案:

没有答案