【问题标题】:Insert/Update multiple records插入/更新多条记录
【发布时间】:2017-04-06 05:13:05
【问题描述】:

我有一个约 100000 条记录的源文件,其中一些记录在数据库中,一些是新的。使用 MongoDb C# 驱动程序检查每个文档是否存在、更新它(如果存在)或插入它(如果它是新的)的最快方法是什么。

我在每个文档上都使用了 FindOneAndUpdateAsync,但这需要很长时间。我找不到使用 MongoDb 驱动程序运行其中多个的方法。我必须在代码异步中并行运行这些?

【问题讨论】:

  • 如果为每个FindOneAndUpdateAsync 启动一个新的Task,为什么不检查性能是否有所提高?
  • 使用批量更新,check this它会帮助你:)

标签: c# mongodb performance


【解决方案1】:

你可以这样做:

var builder = Builders<yourType>.Filter;
var filter = builder.Eq("something", something);
var update = Builders<youType>.Update
    .Set("something", someNewThing)
    .SetOnInsert("something2", someNewThing2);
yourContext.yourCollection.UpdateManyAsync(filter, update, new UpdateOption {IsUpsert = true}).Result.IsAcknowledged;

【讨论】:

    【解决方案2】:

    您可以使用upsert 来满足您的需要,如下所示(引用自 MongoDB 文档的示例)

    var bulk = db.items.initializeUnorderedBulkOp();
    bulk.find( { item: "abc123" } ).upsert().replaceOne(
       {
         item: "abc123",
         status: "P",
         points: 100,
       }
    );
    bulk.execute();
    

    在您的C# 驱动程序上,您可以使用UpdateManyAsync()ReplaceOneAsync() 并将IsUpsert 更新选项设置为true

    【讨论】:

      【解决方案3】:

      对于更新/插入问题,ReplaceOne 将 UpdateOptions 作为参数,您可以在此处指定是否应为 upsert。如果不存在则 Upsert 插入,如果存在则更新。 示例代码(也有一个异步):

      collection.ReplaceOne(query, model, new UpdateOptions() {IsUpsert = upsert});
      

      Alt:

      var options = new UpdateOptions { IsUpsert = true };
      var result = await collection.UpdateManyAsync(filter, update, options);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多