如何使用 Mongo 命令在 DocumentDB 中"patch"文档



我的代码如下:

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

最新更新