【问题标题】: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();
请记住,如果任何属性/字段发生更改,这实际上将替换现有记录。如果实体中的数据与数据库中的文档完全相同,将被忽略。