Mongodb 更新时出错 - 远程分片上的错误 - 由游标 ID 引起

Posted

技术标签:

【中文标题】Mongodb 更新时出错 - 远程分片上的错误 - 由游标 ID 引起【英文标题】:Mongo DB Error while Updating - error on remote shard - caused by cursor id 【发布时间】:2022-01-01 04:58:05 【问题描述】:

我的收藏中有大约 800 万份文档。 我想删除其中一个字段中的特殊字符。 我将在下面发布我的声明。 我在 Mongo db compass 工具中使用 mongo shell。 更新运行大约 30-50 分钟,然后抛出以下错误:

MongoServerError: 远程分片 thisisjustforstack.com:27000 :: 由 :: cursor id 1272890412590646833 未找到引起的错误

我还看到,在抛出这个错误之后,他并没有更新所有文档。

    db.getCollection('TEST_Collection').aggregate(
[
    $match: 
        '1List.Comment': 
            $exists: true
        
    
, 
    $project: 
        '1List.Comment': 1
    
]
)
.forEach(function(doc,Index) doc.1List.Comment=doc.1List.Comment.replace(/[^a-zA-Z 0-9 ]/g, '');
db.TEST_Collection.updateMany( "_id": doc._id , "$set":  "1List.Comment": doc.1List.Comment  );)

有人可以帮助让这个更新语句在不运行某种超时的情况下工作吗?我已经阅读了一些关于 noCursorTimeout() 的内容,但我不确定如何在我的语句中使用它并在 shell 中使用它。

谢谢大家!

【问题讨论】:

【参考方案1】:

不能在单个聚合游标上禁用游标超时。

但是你可以设置全局配置:

mongod --setParameter cursorTimeoutMillis=3600000    #1 hour

无论如何我认为将任务分成小批量是更好的选择

【讨论】:

感谢您的回答!所以我可以执行你在我的 mongo db shell 中编写的命令吗?然后再试试我的更新?你怎么把它分成小批量?我的意思是拿前 100.000 个文件?但是如何告诉他下一批不要再拿同样的文件呢? 尝试使用其他字段来拆分工作

以上是关于Mongodb 更新时出错 - 远程分片上的错误 - 由游标 ID 引起的主要内容,如果未能解决你的问题,请参考以下文章

将 Elastic Beanstalk 上的 Web 服务器与 MongoDB Atlas 上的数据库服务器连接时出错

Mongodb 分片

MongoDB:分片(简介 & 自动分片 & 片键)

mongodb基础学习10-手动预分片

MongoDB基础教程系列--第九篇 MongoDB 分片

在 mongodb 中使用 bcrypt 更新用户密码时出错