How to "patch" a Document in DocumentDB using Mongo commands

Viewed 171

My code is below:

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

My 1 Document in DocumentDB for example is:

{
  "id": "123",
  "delnum": "100001"
}

My toUpdate is:

{
  "is_cancelled" : true
}

My expected document after FindOneAndUpdate is:

{
  "id": "123",
  "delnum": "100001",
  "is_cancelled" : true
}

but what is happening is, it is replacing my document with id=123 to below:

{
  "is_cancelled" : true
}

I would like to know if I am doing it wrong, or what my expectation outcome is not correct.


Edited Code:

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

EDIT: code below what worked for me.

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 });
1 Answers

You're not specifying what you want to update.

Mongo expects json to look like this:

{
  "$set" : {
    "is_cancelled" : true
  }
}

You can use the update builder to make that easier:

var builder = Builders<MyModel>.Update;
var update = builder.Set("is_cancelled", true);

You can also chain multiple Set methods on the builder:

var update = builder.Set("a", 1).Set("b", 2);
Related