【问题标题】:MongoDB Batch update performance problemsMongoDB批量更新性能问题
【发布时间】:2018-02-10 16:35:47
【问题描述】:

我了解 MongoDB 支持批量插入,但不支持批量更新。

批量插入数千个文档非常快,但更新数千个文档却非常慢。太慢了,我现在使用的解决方法是删除旧文档并批量插入更新的文档。我必须添加一些标志来将它们标记为无效以及从失败的模拟“批量更新”中进行补偿所需的所有内容。 :(

我知道这是一个糟糕且不安全的解决方案,但这是我能够达到所需性能的唯一方法。

如果你知道更好的方法,请帮助我。

谢谢!

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    只要您使用的是 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();
    

    【讨论】:

    • 谢谢!我对其进行了测试,并且在 V2.6 上运行良好。有趣的是,即使您使用的是 V2.4,C# 驱动程序也会接受批量语法,但在内部它似乎以缓慢的方式执行它。好吧,似乎是时候迁移到 2.6 了。
    【解决方案2】:

    我也遇到过类似的情况,经过反复试验,我在 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"});
    

    希望这将帮助您进行批量操作

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多