据我所知,MongoDB支持批量插入,但不支持批量更新。
批量插入数千个文档非常快,但更新数千个文档非常慢。我现在使用的解决方法是如此慢,以便删除旧文档并批量插入更新的文档。我不得不添加一些标记来将它们标记为无效以及从失败的模拟“批量更新”中补偿所需的所有内容。 :(
我知道这是一个糟糕且不安全的解决方案,但它是我能够达到所需性能的唯一方式。
如果你知道更好的方法,请帮助我。
谢谢!
答案 0 :(得分:2)
只要您使用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();
答案 1 :(得分:0)
我有类似的情况,经过反复试验,我在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 Schema:
ItemSchema.index({name: 1, active: 1}, {name: "itemnameactive"});
希望这可以帮助您进行批量操作