如何跳过批量插入中的重复文档并忽略具有特定字段的重复项 c#
How do I skip duplicate documents in a bulk insert and ignore duplicates with a specific field c#
我需要插入很多文档并忽略重复的文档。
文档格式:
_id:5b84e2588aceda018a974450
Name:"Jeff M"
Email:"jeff.m@xtrastaff.com"
Type:"Client"
UserId:Binary('Rw+KMGpSAECQ3gwCtfoKUg==')
UserImage:null
我想在插入时使用 EmailId 字段检查重复项。仅在不存在时插入。
为了防止插入重复项,您需要一个 unique index,它可以在 C# 代码中创建:
public void CreateIndex()
{
var options = new CreateIndexOptions() { Unique = true };
var field = new StringFieldDefinition<Model>(nameof(Model.Email));
var indexDefinition = new IndexKeysDefinitionBuilder<Model>().Ascending(field);
Collection.Indexes.CreateOne(indexDefinition, options);
}
然后您可以使用BulkWrite操作插入多个文档。问题是,默认情况下,当第一次插入操作失败时(当您尝试插入重复项时会发生这种情况),处理将停止,并且您将在 C# 中得到一个异常。您可以通过将 ordered
参数设置为 false
来修改它,这意味着将处理所有插入 "in parallel" 并且您将得到一个异常,该异常汇总了所有失败的插入。该异常属于 MongoBulkWriteException
类型,您可以尝试捕获它。所以你可以试试下面的方法:
public void InsertData(List<Model> data)
{
var writeOps = data.Select(x => new InsertOneModel<Model>(x));
try
{
Collection.BulkWrite(writeOps, new BulkWriteOptions() { IsOrdered = false });
}
catch (MongoBulkWriteException ex)
{
// will be thrown when there were any duplicates
}
}
我需要插入很多文档并忽略重复的文档。
文档格式:
_id:5b84e2588aceda018a974450
Name:"Jeff M"
Email:"jeff.m@xtrastaff.com"
Type:"Client"
UserId:Binary('Rw+KMGpSAECQ3gwCtfoKUg==')
UserImage:null
我想在插入时使用 EmailId 字段检查重复项。仅在不存在时插入。
为了防止插入重复项,您需要一个 unique index,它可以在 C# 代码中创建:
public void CreateIndex()
{
var options = new CreateIndexOptions() { Unique = true };
var field = new StringFieldDefinition<Model>(nameof(Model.Email));
var indexDefinition = new IndexKeysDefinitionBuilder<Model>().Ascending(field);
Collection.Indexes.CreateOne(indexDefinition, options);
}
然后您可以使用BulkWrite操作插入多个文档。问题是,默认情况下,当第一次插入操作失败时(当您尝试插入重复项时会发生这种情况),处理将停止,并且您将在 C# 中得到一个异常。您可以通过将 ordered
参数设置为 false
来修改它,这意味着将处理所有插入 "in parallel" 并且您将得到一个异常,该异常汇总了所有失败的插入。该异常属于 MongoBulkWriteException
类型,您可以尝试捕获它。所以你可以试试下面的方法:
public void InsertData(List<Model> data)
{
var writeOps = data.Select(x => new InsertOneModel<Model>(x));
try
{
Collection.BulkWrite(writeOps, new BulkWriteOptions() { IsOrdered = false });
}
catch (MongoBulkWriteException ex)
{
// will be thrown when there were any duplicates
}
}