Как пропустить дубликаты документов при массовой вставке и игнорировать дубликаты с определенным полем c # - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно вставить много документов и игнорировать дублирующиеся документы.

Формат документа:

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

Я хочу проверить дублирование, используя поле EmailId при вставке. Вставьте, только если он не существует.

1 Ответ

0 голосов
/ 28 августа 2018

Чтобы предотвратить вставку дубликатов, вам необходим уникальный индекс , который можно создать в коде 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
    }
}
...