MongoDB C#Driver 2.0 - 更新文档

Ale*_*llo 29 c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

我目前正在将我的代码升级到MongoDB C#驱动程序2.0,并且我在升级代码以更新文档时遇到问题.

使用旧版本,我能够做到这样的事情:

MyType myObject; // passed in 
var collection = _database.GetCollection<MyType>("myTypes");
var result = collection.Save(myObject);
Run Code Online (Sandbox Code Playgroud)

我很难在新版本中找到一种方法.我找到了一些更新单个字段的例子

var filter = Builders<MyType>.Filter.Eq(s => s.Id, id);
var update = Builders<MyType>.Update.Set(s => s.Description, description);
var result = await collection.UpdateOneAsync(filter, update);
Run Code Online (Sandbox Code Playgroud)

我想用旧方法更新所有字段,方法是Save.

有任何想法吗 ?

非常感谢

mne*_*syn 26

我想你正在寻找ReplaceOneAsync():

MyType myObject; // passed in 
var filter = Builders<MyType>.Filter.Eq(s => s.Id, id);
var result = await collection.ReplaceOneAsync(filter, myObject)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢记忆!我正要发布我自己的答案,因为我几分钟前才发现 ReplaceOneAsync。无论如何,这正是我所需要的! (3认同)

i3a*_*non 26

为了增加mnemosyn的答案,同时简单的ReplaceOneAsync做更新文档是不等同于SaveSave也将插入文档,如果它没有找到一个更新.

要实现相同的行为,ReplaceOneAsync需要使用options参数:

MyType myObject; 
var result = await collection.ReplaceOneAsync(
    item => item.Id == id, 
    myObject, 
    new UpdateOptions {IsUpsert = true});
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以按如下方式使用 LINQ:

await context.collection.ReplaceOneAsync(b=> b.Id == item.Id,item);
Run Code Online (Sandbox Code Playgroud)