我的代码如下:
MyModel requestID = new MyModel
{
"id" = "123"
};
MyModel toUpdate = new MyModel
{
"is_cancelled" : true
};
FilterDefinition<MyModel> filter = requestID.ToBsonDocument();
UpdateDefinition<MyModel> update = toUpdate.ToBsonDocument();
collection.FindOneAndUpdate(filter, update);
我在文档中的1个文档例如:
{
"id": "123",
"delnum": "100001"
}
我的toupdate是:
{
"is_cancelled" : true
}
FindOneAndupdate之后的我的预期文件是:
{
"id": "123",
"delnum": "100001",
"is_cancelled" : true
}
但是发生的是,它用ID = 123到下面代替我的文档:
{
"is_cancelled" : true
}
我想知道我是否做错了,或者我的期望结果不正确。
编辑的代码:
MyModel requestID = new MyModel
{
"id" = "123"
};
MyModel toUpdate = new MyModel
{
"is_cancelled" : true
};
var builder = Builders<MyModel>.Update;
UpdateDefinition<MyModel> update =null;
toUpdate.GetType().GetProperties().ToList().ForEach(
x => update = builder.Set(x.Name, x.GetValue(toUpdate, null))
FilterDefinition<MyModel> filter = requestID.ToBsonDocument();
if (update == null) return;
collection.FindOneAndUpdate(filter, update);
编辑:代码下方对我有用的代码。
var filterData = Builders<MyModel>.Filter.Eq("id", "123"); //requestID
var updateData = new BsonDocumentUpdateDefinition<MyModel>(new BsonDocument("$set", toUpdate));
await collection.FindOneAndUpdateAsync(filter, updateData , new FindOneAndUpdateOptions<MyModel>() { IsUpsert = false });
您没有指定要更新的内容。
Mongo希望JSON看起来像这样:
{
"$set" : {
"is_cancelled" : true
}
}
您可以使用Update Builder使其更容易:
var builder = Builders<MyModel>.Update;
var update = builder.Set("is_cancelled", true);
您还可以在构建器上链接多个Set
方法:
var update = builder.Set("a", 1).Set("b", 2);