38

我目前正在将我的代码升级到 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

4 回答 4

41

我想你正在寻找ReplaceOneAsync()

MyType myObject; // passed in 
var filter = Builders<MyType>.Filter.Eq(s => s.Id, id);
var result = await collection.ReplaceOneAsync(filter, myObject)
于 2015-05-15T12:11:17.690 回答
30

添加到 mnemosyn 的答案中,虽然一个简单的ReplaceOneAsync确实更新了一个文档,但它并不等同于Save如果Save它没有找到要更新的文档,它也会插入该文档。

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

MyType myObject; 
var result = await collection.ReplaceOneAsync(
    item => item.Id == id, 
    myObject, 
    new UpdateOptions {IsUpsert = true});
于 2015-05-15T17:34:14.793 回答
6

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

await context.collection.ReplaceOneAsync(b=> b.Id == item.Id,item);
于 2015-12-22T16:56:27.350 回答
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);
于 2021-01-24T06:15:06.600 回答