插入/更新多个记录

时间:2016-11-22 13:40:24

标签: c# mongodb performance

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

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

3 个答案:

答案 0 :(得分:0)

对于更新/插入问题,ReplaceOne将UpdateOptions作为参数,在这里您可以指定它是否应该是upsert。如果不存在,则插入插入,如果存在则更新。 示例代码(也有一个异步):

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

替代:

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

答案 1 :(得分: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更新选项设置为true

答案 2 :(得分: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;