我已经创建了一个包含100万个文档的集合,我尝试基于ObjectID选择50000条这些记录,并更新其中的一个值(我在Mongo中工作,运行在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,乔恩
发布于 2014-07-26 00:38:41
如果您只是在寻找一个“范围”,它涵盖了集合中的5万份文档,那么您最好的方法是首先查询和查找范围的“开始”和“结束”文档。然后将“范围”规范应用于您的更新。
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个文档,而没有任何其他标准这样做。
还请注意在update方法中使用"multi“。默认情况下,.update()
不会比一个文档“更新”更多,基本上是第一个匹配。因此,您要做的是更新“范围内的所有文档”,这就是为什么您需要在这里应用“多”。
https://stackoverflow.com/questions/24968862
复制相似问题