我创建了一个包含100万个文档的Collection,我正在尝试根据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, 乔恩
答案 0 :(得分:1)
如果您只是寻找涵盖集合中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()
不会“更新”一个文档,基本上是第一个匹配项。所以你的意思是更新“范围内的所有文件”,这就是你需要在这里应用“多”的原因。