如何将一个字段批量复制到数组的第一个对象并更新MongoDB中的文档?

时间:2016-12-30 13:45:21

标签: mongodb mongoose bulkupdate

我想将文档中的价格信息复制到prices[]数组。

var entitiesCol = db.getCollection('entities');
entitiesCol.find({"type": "item"}).forEach(function(item){
    item.prices = [ {
        "value": item.price
    }];
    entitiesCol.save(item);
});

这需要很长时间,有些字段不会更新。

我在服务器端使用Mongoose,我也可以使用它。

我能为此做些什么?

1 个答案:

答案 0 :(得分:1)

在mongo shell中,您可以使用 bulkWrite() 方法以快速有效的方式执行更新。请考虑以下示例:

\0

如果您的收藏很大,上面的var entitiesCol = db.getCollection('entities'), counter = 0, ops = []; entitiesCol.find({ "type": "item", "prices.0": { "$exists": false } }).snapshot().forEach(function(item){ ops.push({ "updateOne": { "filter": { "_id": item._id }, "update": { "$push": { "prices": { "value": item.price } } } } }); counter++; if (counter % 500 === 0) { entitiesCol.bulkWrite(ops); ops = []; } }) if (counter % 500 !== 0) entitiesCol.bulkWrite(ops); 变量可以有效地管理您的批量更新。它允许您批量更新操作,并以500的批量将写入发送到服务器,这样可以提供更好的性能,因为您不会向服务器发送每个请求,每500个请求中只发送一次。

对于批量操作,MongoDB每批执行default internal limit of 1000个操作,因此从某种意义上来说,选择500个文档是好的,因为你可以控制批量大小,而不是让MongoDB强加默认值,即对于大型操作在>的大小> 1000份文件。