2016-11-22 14 views
1

У меня есть исходный файл записей ~ 100000, некоторые из этих записей находятся в db, а некоторые - новые. Какой самый быстрый способ проверить каждый документ, если он существует, обновить его, если он есть, или вставить его, если его новый использует драйвер MongoDb C#.Вставка/обновление нескольких записей

Я использовал FindOneAndUpdateAsync для каждого документа, но это занимает много времени. Я не могу найти способ запустить несколько из них с помощью драйвера MongoDb. Мне пришлось бы запускать эти параллели в async кода?

+0

Почему вы не проверить, если производительность улучшается, если вы начинаете новый 'Task' для каждого' FindOneAndUpdateAsync'? –

+0

Используйте массовое обновление, [проверьте это] (http://stackoverflow.com/questions/7934768/how-to-update-and-upsert-mulitple-documents-in-mongodb-using-c-sharp-drivers), он будет помочь тебе :) – Yogesh

ответ

0

Для проблемы с обновлением/вставкой ReplaceOne принимает параметр UpdateOptions в качестве параметра, здесь вы можете указать, должно ли оно быть upsert. Upsert inserts if not existing, обновления, если существует. Пример кода (Там один асинхронной а):

collection.ReplaceOne(query, model, new UpdateOptions() {IsUpsert = upsert}); 

Alt:

var options = new UpdateOptions { IsUpsert = true }; 
var result = await collection.UpdateManyAsync(filter, update, options); 
0

Вы можете использовать upsert для вашей потребности, как показано ниже (пример цитируемый из MongoDB документации)

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.find({ item: "abc123" }).upsert().replaceOne(
    { 
    item: "abc123", 
    status: "P", 
    points: 100, 
    } 
); 
bulk.execute(); 

На вашем C# водителе вы можете использовать UpdateManyAsync() ИЛИ ReplaceOneAsync() с IsUpsert update opt ион установлен true

0

Вы можете сделать что-то вроде этого:

var builder = Builders<yourType>.Filter; 
var filter = builder.Eq("something", something); 
var update = Builders<youType>.Update 
    .Set("something", someNewThing) 
    .SetOnInsert("something2", someNewThing2); 
yourContext.yourCollection.UpdateManyAsync(filter, update, new UpdateOption {IsUpsert = true}).Result.IsAcknowledged; 
Смежные вопросы