我创建了一个包含 100 万个文档的集合,我尝试根据 ObjectID 选择其中的 50000 条记录,并更新其中一个值(我正在 Mongo shell 中工作,在 Ubuntu 上运行)。
是否可以定义 50000 个文档范围? 50000 范围内包含哪些文档并不重要,我只是想隔离一定数量的记录并使用主 id 运行更新操作,以便可以测量性能时间。
我尝试运行的代码不起作用:
use Assignment
var _start = new Date()
db.FlightsDate.update({$set:{Airtime: 8888}}).limit(50000).hint({_id:1});
var _end = new Date();
print("Time to Bulk Update AirTime key for 50000 documents… " + ((_end _start)/1000));
...我发现 MongoDB 需要我在命令中包含一个查询来指定要更新哪些文档(我现在通过阅读其他帖子了解到 .limit 不会比.update 写入)。
请问有人可以建议一种方法,使我能够定义要更新的记录数吗?
感谢您的建议。
R, 乔恩
最佳答案
如果您只是查找涵盖集合中 50,000 个文档的“范围”,那么最好的方法是首先查询并查找范围的“起始”和“结束”文档。然后将该“范围”规范应用于您的更新。
var start_id = db.FlightsDate.find({}).limit(1).toArray()[0]._id;
var end_id = db.FlightsDate.find({}).skip(49999).limit(1).toArray()[0]._id;
var _start = new Date();
db.FlightsDate.update(
{ "_id": { "$gte": start_id, "$lte": end_id } },
{ "$set"; { "Airtime": 8888 } },
{ "multi": true }
);
var _end = new Date();
( _end - _start )/1000;
如果您想在附加范围内添加下 50,000 个,则:
var start_id = db.FlightsDate.find(
{ "_id": { "$gt": end_id } }
).limit(1).toArray()[0]._id;
var end_id = db.FlightsDate.find(
{ "_id": { "$gt": end_id } }
).skip(49999).limit(1).toArray()[0]._id;
然后再做一遍。
关键是您需要知道在一个范围内从哪里“开始”以及何时“结束”,以将更新限制为仅 50,000 个文档,而无需任何其他标准。
另请注意更新方法中“multi”的用法。默认情况下,.update()
不会“更新”多个文档,本质上是第一个匹配项。因此,您要做的是更新“范围内的所有文档”,这就是您需要在此处应用“multi”的原因。
关于javascript - MongoDB:如何根据ObjectID更新n条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968862/