我有一个记录的源文件~100000,其中一些记录在db中,有些是新的。检查每个文档是否存在的最快方法是什么,如果存在则更新它,或者如果新文档使用MongoDb C#驱动程序则将其插入。
我在每个文档上都使用了FindOneAndUpdateAsync,但这需要很长时间。我找不到使用MongoDb驱动程序运行多个这些的方法。我必须在代码异步中运行这些并行吗?
答案 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;