我有一个记录~100000的源文件,其中一些记录在数据库中,一些是新的。如果它存在,检查每个文档的最快方法是什么,如果它存在,则更新它,或者如果它使用MongoDb C#驱动程序的新文件,则插入它。插入/更新多个记录
我在每个文档上都使用了FindOneAndUpdateAsync,但它需要很长时间。我无法找到使用MongoDb驱动程序运行多个程序的方法。我将不得不在代码异步运行这些并行?
我有一个记录~100000的源文件,其中一些记录在数据库中,一些是新的。如果它存在,检查每个文档的最快方法是什么,如果它存在,则更新它,或者如果它使用MongoDb C#驱动程序的新文件,则插入它。插入/更新多个记录
我在每个文档上都使用了FindOneAndUpdateAsync,但它需要很长时间。我无法找到使用MongoDb驱动程序运行多个程序的方法。我将不得不在代码异步运行这些并行?
对于更新/插入问题,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);
您可以使用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
你可以做这样的事情:
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;
你为什么不检查的性能,如果你开始一个新的'Task'每个'FindOneAndUpdateAsync'提高? –
使用批量更新,[检查此](http://stackoverflow.com/questions/7934768/how-to-update-and-upsert-mulitple-documents-in-mongodb-using-c-sharp-drivers)它会帮你 :) – Yogesh