【发布时间】:2018-02-10 16:35:47
【问题描述】:
我了解 MongoDB 支持批量插入,但不支持批量更新。
批量插入数千个文档非常快,但更新数千个文档却非常慢。太慢了,我现在使用的解决方法是删除旧文档并批量插入更新的文档。我必须添加一些标志来将它们标记为无效以及从失败的模拟“批量更新”中进行补偿所需的所有内容。 :(
我知道这是一个糟糕且不安全的解决方案,但这是我能够达到所需性能的唯一方法。
如果你知道更好的方法,请帮助我。
谢谢!
【问题讨论】:
标签: mongodb
我了解 MongoDB 支持批量插入,但不支持批量更新。
批量插入数千个文档非常快,但更新数千个文档却非常慢。太慢了,我现在使用的解决方法是删除旧文档并批量插入更新的文档。我必须添加一些标志来将它们标记为无效以及从失败的模拟“批量更新”中进行补偿所需的所有内容。 :(
我知道这是一个糟糕且不安全的解决方案,但这是我能够达到所需性能的唯一方法。
如果你知道更好的方法,请帮助我。
谢谢!
【问题讨论】:
标签: mongodb
只要您使用的是 MongoDB v2.6 或更高版本,您也可以使用批量操作来执行更新。
来自the docs的示例:
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );
bulk.find( { item: null } ).update( { $set: { item: "TBD" } } );
bulk.execute();
【讨论】:
我也遇到过类似的情况,经过反复试验,我在 MongoDB 或通过 mongoose 创建了一个索引,现在使用批量操作(即bulk.find({}).upsert.update({}))可以快速处理数千个文档。
例子:
var bulk = items.collection.initializeOrderedBulkOp();
bulk.find({fieldname: value, active: false}).updateOne({.upsert().updateOne({
$set: updatejsondata,
$setOnInsert: createjsondata
});
Note: you need to use $push for storing in array like $set, you need to include $push
example:
bulk.find({name: value, active: false}).updateOne({.upsert().updateOne({
$set: updatejsondata,
$push: {logdata: filename + " - " + new Date()}
$setOnInsert: createjsondata
});
创建索引:在上面的 Items 集合中,您需要在搜索字段(即名称、活动)上创建索引
示例:
Mongo 命令行:
db.items.ensureIndex({name: 1, active: 1}, {unique: false, dropDups: false})
Mongoose 架构:
ItemSchema.index({name: 1, active: 1}, {name: "itemnameactive"});
希望这将帮助您进行批量操作
【讨论】: