更新MongoDb中对象的所有属性

时间:2015-06-17 13:25:46

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

我在我的项目中使用MongoDB .Net驱动程序。我想更新存储在MongoDB中的对象的所有属性。在文档中,更新显示如下:

var filter = Builders<BsonDocument>.Filter.Eq("i", 10);
var update = Builders<BsonDocument>.Update.Set("i", 110);

await collection.UpdateOneAsync(filter, update);

但我不想为所有属性调用Set方法,因为有很多属性,将来可能会有更多属性。

如何使用MongoDB .Net驱动程序更新整个对象?

3 个答案:

答案 0 :(得分:20)

您可以使用ReplaceOneAsync代替UpdateOneAsync来完成此操作。

您需要一个过滤器来匹配现有文档(文档ID最简单的过滤器)和新对象。

Hamster hamster = ...
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster);

答案 1 :(得分:0)

如果要更新整个BsonDocument,则存在从BsonDocument到UpdateDefinition的隐式转换。

https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/UpdateDefinition.cs

var doc = new BsonDocument() { .... }
UpdateDefinition<BsonDocument> update = doc;

答案 2 :(得分:-2)

var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null)))));
var options = new UpdateOptions();
collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options);

此代码使用反射来包含给定对象的所有属性 对于update语句,无需手动添加所有属性,因为您看到Id被明确排除在update语句之外以避免异常。