我Collection 了900万张唱片.我目前正在使用以下脚本更新整个集合:

简单的更新.js

db.mydata.find().forEach(function(data) {
  db.mydata.update({_id:data._id},{$set:{pid:(2571 - data.Y + (data.X * 2572))}});
});

这是从命令行运行的,如下所示:

mongo my_test simple_update.js

因此,我所做的就是根据一个简单的计算添加一个新字段pid.

有没有更快的办法?这需要大量的时间.

推荐答案

你可以做两件事.

  1. 发送"multi"标志设置为true的更新.
  2. 将函数存储在服务器端,然后try 使用server-side code execution.

该链接还包含以下建议:

这是执行批量管理工作的一种好方法.在服务器上运行mongo,通过localhost接口连接.然后,连接速度非常快,延迟很低.这比db更友好.eval()作为db.eval()阻止其他操作.

这可能是你最快的速度了.您必须意识到,在一台服务器上发布900万次更新将是一项繁重的操作.假设你每秒可以获得3k更新,你仍然在谈论 run 近一个小时.

这并不是真正的"mongo问题",而是硬件限制.

Mongodb相关问答推荐

geoLocation或geoNear为坐标和半径使用let变量

无法从我的NextJS 14应用程序中的Redux工具包2.0中提取数据

无法配置数据源:未指定url属性,无法为 MongoDb 配置嵌入数据源

如何判断 mongodb 聚合,该文档具有键,该键是一个数组,其第二个元素是否存在?

MongoDB:使用数组过滤器进行更新插入

在 mongoDB 中存储 java 8 LocalDate

使用 MongoDB 进行分页

Clojure 和 NoSQL 数据库

如何在 mongo JavaScript shell 中中止查询

Mongoose.js 通过一个 connect() 调用创建到 MongoDB 的多个连接

将 mongodb 聚合框架结果导出到新集合

MongoDB 日志(log)文件和 oplog 有何不同?

错误:Could not connect to any servers in your MongoDB Atlas cluster

在 MongoDB 上使用 $push 更新数组时避免重复值

RoboMongo:不显示所有文档

从 mongo 结果中删除 _id

Mongoose:Model.create 和 Collection.insert 有什么区别

AsQueryable 方法是否在新的 Mongodb C# 驱动程序 2.0rc 中离开?

将日期从毫秒转换为 ISODate 对象

在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么