我目前正在将我的代码升级到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方法更新所有字段,就像我在旧版本中所做的那样。
有什么想法吗?
非常感谢
答案 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);