MongoDB:如何根据ObjectID更新n条记录

时间:2014-07-26 07:54:40

标签: javascript mongodb mongodb-query

我创建了一个包含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, 乔恩

1 个答案:

答案 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()不会“更新”一个文档,基本上是第一个匹配项。所以你的意思是更新“范围内的所有文件”,这就是你需要在这里应用“多”的原因。