MongoDB C#Driver 2.0 - 更新文档

时间:2015-05-15 10:19:15

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

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

使用旧版本我可以做到这样的事情:

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

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

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);

我想使用Save方法更新所有字段,就像我在旧版本中所做的那样。

有什么想法吗?

非常感谢

4 个答案:

答案 0 :(得分:23)

我认为您正在寻找ReplaceOneAsync()

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

答案 1 :(得分:23)

要添加到mnemosyn的答案,而简单的ReplaceOneAsync确实更新了文档,它不等同于Save,因为Save也会插入文档它没有找到要更新的。

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

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

答案 2 :(得分:2)

你可以使用LINQ:

await context.collection.ReplaceOneAsync(b=> b.Id == item.Id,item);

答案 3 :(得分:0)

使用ObjectId.Parse(id)

var filter = Builders<MyType>.Filter.Eq(s => s.Id, ObjectId.Parse(id));
var update = Builders<MyType>.Update.Set(s => s.Description, description);
var result = await collection.UpdateOneAsync(filter, update);