Javascript MongoDB:如何基于ObjectID更新n条记录

Javascript MongoDB:如何基于ObjectID更新n条记录,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我已经创建了一个包含一百万个文档的集合,我正试图根据ObjectID选择50000个这些记录,并更新其中一个值(我在MongoShell中工作,运行在Ubuntu上) 是否可以定义50000个文档范围?50000范围内包含哪些文档并不重要,我只想限制一定数量的记录,并使用主id运行更新操作,以便测量性能时间 我尝试运行的代码无效: use Assignment var _start = new Date() db.FlightsDate.update({$set:{Airtime:

我已经创建了一个包含一百万个文档的集合,我正试图根据ObjectID选择50000个这些记录,并更新其中一个值(我在MongoShell中工作,运行在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,
Jon

如果您只是在寻找一个涵盖集合中50000个文档的“范围”,那么最好的方法是首先查询并找到您范围内的“开始”和“结束”文档。然后将该“范围”规范应用于您的更新

var start_id=db.FlightsDate.find({}).limit(1).toArray()[0]。\u id;
var end_id=db.FlightsDate.find({}).skip(49999).limit(1).toArray()[0]。id;
var_start=新日期();
db.FlightsDate.update(
{“_id”:{“$gte”:开始_id,$lte:结束_id},
{“$set”{“Airtime:8888}},
{“多”:真}
);
var_end=新日期();
(_end-_start)/1000;
如果您希望在额外范围内获得下一个50000,则:

var start\u id=db.FlightsDate.find(
{“\u id”:{“$gt”:end\u id}
).limit(1).toArray()[0]。\u id;
var end_id=db.FlightsDate.find(
{“\u id”:{“$gt”:end\u id}
).skip(49999).limit(1).toArray()[0]。\u id;
再做一遍

关键是,您需要知道在某个范围内“开始”和“结束”的位置,以便将更新限制为仅50000个文档,而无需任何其他标准


还要注意update方法中“multi”的用法。默认情况下,
.update()
最多只“更新”一个文档,基本上是第一个匹配项。因此,您的意思是更新“范围内的所有文档”,这就是您需要在此处应用“multi”的原因。

代码无效,因为您需要在
.update()方法中使用“查询”和“更新”部分。此外,“查询”修饰符对于“更新”无效。你真的应该解释一下更新中的50000个文档是什么意思。最简单的方法(如果这是您的意思)是在查询中指定ObjectId值的“范围”。谢谢Neil。我正在尝试一种基于ObjectID获取记录范围的方法。我已经按照Asc和Desc顺序进行了排序,以找到我的最低(53d0a8b94a1d36ad0102d121)和最高(53d0a9004a1d36ad0112135a)对象,但由于顺序对我来说不清楚,我不确定如何定义范围?谢谢Neil。我在“$set”后面加了一个冒号,因为它在意外标记上出错。但它给了我一个:“errmsg”:“未知的顶级操作员:$gte”我已经尝试过使用/不使用“,但无法解决它。你觉得怎么样?@Jon295087可怕的打字错误。我很少在没有运行要测试的语句的情况下输入它。更正。这太棒了,尼尔,工作起来像个梦:-)我不是太担心,但命令设法更新了50702个文档。不太清楚为什么会这样?@Jon295087别忘了通过“接受”帮助你的答案来帮助那些帮助你的人。@NeilLunn这个答案帮助了我。小观察。有一个“;”而不是:在你的回答中。