1

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

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

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

4

1 回答 1

0

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

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();

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

于 2021-04-16T04:13:13.150 回答