【问题标题】:C# MongoDb.driver How to insert many records without duplicates and return resultsC# MongoDb.driver 如何插入多条不重复的记录并返回结果
【发布时间】:2021-07-10 18:28:02
【问题描述】:

我想请教一下,添加多少条不重复的记录并返回结果。

我的情况:我有一个列表,必须将它们全部插入数据库,但需要排除数据库中已经存在的记录(需要根据对象列表中的 UniqueId 字段进行比较 - UniqueId 是单个指数)。我需要知道哪些对象被复制,哪些对象被成功添加到数据库中。目前,我有一个可行的解决方案,但性能不是最好的,因为我一个接一个地插入文档,并且基于 MongoWriteException=11000(duplicate) 我能够识别文档是否重复。 我正在考虑使用 InsertMany 的不同方法,我还应该能够捕获重复项(必须解析错误消息并检索重复的 UniqueId),但是成功处理的记录是什么。最初我虽然可以在 mongo 分配的 ID 属性列表中看到,但是为所有实体(添加和重复)填充了 ID,因此必须遍历列表并检查 id。

您有更好的想法/解决方案如何解决这种情况吗?

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver mongodb.driver


    【解决方案1】:

    您可以像这样利用批量写入功能:

    var list = new[] {
        new Book { Id = "1", UniqueId = "100", Title = "one" }, //existing record
        new Book { Id = "2", UniqueId = "200", Title = "two" },
        new Book { Id = "3", UniqueId = "300", Title = "three" }
    };
    
    var models = new List<WriteModel<Book>>(list.Length);
    
    foreach (var book in list)
    {
        var upsert = new ReplaceOneModel<Book>(
            filter: Builders<Book>.Filter.Eq(e => e.UniqueId, book.UniqueId),
            replacement: book)
        { IsUpsert = true };
    
        models.Add(upsert);
    }
    
    var result = await collection.BulkWriteAsync(models);
    
    var addedIds = result.Upserts.Select(u => u.Id.AsString);
    
    var replacedIds = list.Select(x => x.Id).Except(addedIds);
    
    Console.WriteLine("added ids: " + string.Join(",", addedIds));
    Console.WriteLine("duplicate ids: " + string.Join(",", replacedIds));
    Console.ReadLine();
    

    请记住,如果任何属性/字段发生更改,这实际上将替换现有记录。如果实体中的数据与数据库中的文档完全相同,将被忽略。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2012-10-21
      • 1970-01-01
      相关资源
      最近更新 更多