我想将文档中的价格信息复制到prices[]
数组。
var entitiesCol = db.getCollection('entities');
entitiesCol.find({"type": "item"}).forEach(function(item){
item.prices = [ {
"value": item.price
}];
entitiesCol.save(item);
});
这需要很长时间,有些字段不会更新。
我在服务器端使用Mongoose,我也可以使用它。
我能为此做些什么?
答案 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份文件。