如何对阵列中的嵌入式文档执行可扩展的批量更新

时间:2014-11-17 14:56:26

标签: javascript performance mongodb

我有一个带有 likes 数组的用户集合。我需要更新所有 为每个用户。

我写了一个脚本来做到这一点,但它很疯狂。 我需要更新数以千万计的用户。

db.users.find().forEach( function(user) {   
  users.likes.forEach( function(like){ 
    like.stars = 5;
  });

  db.users.save(user);
});

你知道更快的方法吗?

编辑:

示例文档如下所示:

{
  "_id" : ObjectId("4f0f31ab0c20020600012301"),
  "created_at" : ISODate("2012-01-12T19:16:59.748Z"),
  "predictions" : null,
  "likes" : [ 
    {
      "_id" : ObjectId("4f0f4a3978c7890600020f2b"),
      "brand_id" : "bcbgmaxazria"
    }
  ],
  "updated_at" : ISODate("2012-12-19T10:09:20.000Z")
}

我想为喜欢的集合中的所有对象添加值为5的新 stars 字段。

1 个答案:

答案 0 :(得分:0)

这是一个普遍的问题。有关详细信息,请参阅https://stackoverflow.com/a/4669702/1296707 - 并且不要忘记荣誉! ;)

但是,您可以使用批量操作更快地完成它。

var bulk = db.users.initializeUnorderedBulkOp()

db.users.find().forEach(
  function(user){
    user.likes.forEach(
      function(like){ like.stars = 5; }
    );
  bulk.find({_id:user._id}).replaceOne(user)
 });

 bulk.execute();

这是在mongo shell中,应该可以工作。它也应该更快。