首页 > 解决方案 > 如何在批量插入中跳过重复文档并忽略具有特定字段 c# 的重复项

问题描述

我需要插入许多文档并忽略重复的文档。

文件格式:

_id:5b84e2588aceda018a974450
Name:"Jeff M"
Email:"jeff.m@xtrastaff.com"
Type:"Client"
UserId:Binary('Rw+KMGpSAECQ3gwCtfoKUg==')
UserImage:null

我想在插入时使用EmailId字段检查重复项。仅当它不存在时才插入。

标签: mongodbmongodb-querymongodb-.net-drivermongodb-csharp-2.0

解决方案


为了防止插入重复项,您需要一个可以在 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这意味着所有插入都将“并行”处理,并且您将得到一个异常,该异常聚合了所有失败的插入。该异常是类型的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
    }
}

推荐阅读