2016-11-22 95 views
1

我有一个记录~100000的源文件,其中一些记录在数据库中,一些是新的。如果它存在,检查每个文档的最快方法是什么,如果它存在,则更新它,或者如果它使用MongoDb C#驱动程序的新文件,则插入它。插入/更新多个记录

我在每个文档上都使用了FindOneAndUpdateAsync,但它需要很长时间。我无法找到使用MongoDb驱动程序运行多个程序的方法。我将不得不在代码异步运行这些并行?

+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。插入插入(如果不存在),更新(如果存在)。 示例代码(有一个异步以及):

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您的需求,像下面

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.find({ item: "abc123" }).upsert().replaceOne(
    { 
    item: "abc123", 
    status: "P", 
    points: 100, 
    } 
); 
bulk.execute(); 
(从MongoDB的文档引用的例子)

在您的C#驱动程序上,您可以使用UpdateManyAsync()ReplaceOneAsync()IsUpsert更新选项离子设置为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;