Как «исправить» документ в DocumentDB с помощью команд Mongo - PullRequest
2 голосов
/ 28 июня 2019

Мой код указан ниже:

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 документ в DocumentDB, например:

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

Мое обновление:

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

1 Ответ

2 голосов
/ 29 июня 2019

Вы не указываете, что хотите обновить.

Монго ожидает, что json будет выглядеть следующим образом:

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

Вы можете использовать построитель обновлений, чтобы упростить это:

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

Вы также можете связать несколько Set методов в компоновщике:

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