Можно сделать частичное обновление, но завершить сохранение документа в mongodb? - PullRequest
0 голосов
/ 06 мая 2019

Используя mongoDB, я хочу обновить определенное поле условно (обновить поле, если существующее значение меньше, чем update).Однако, если документ не существует, я хочу, чтобы весь документ был вставлен.

Что раньше работало:

Ранее я использовал комбинацию $ max (для установки поля)и $ setOnInsert (для установки остальной части документа), который сделал то, что я хотел.

Это не позволило будущим обновлениям уменьшить указанное поле.Например, имея следующую схему документа:

{
  _id: [ObjectId]
  key: [string],
  foo: [string],
  bar: [string],
  value: [number]
}

Мои обновления выглядят примерно так:

db.collection.update(
  { key: "something unique" },
  {
    $max : { value: 100 },
    $setOnInsert: {
      key: "something unique",
      foo: "yes",
      bar: "probably"
    }
  },
  { upsert: true }
)

При первом обновлении будет создан документ с указанным value и всеми последующимиобновления никогда не уменьшат поле value и не изменят какие-либо другие данные.

Чтобы сделать это программно, мне пришлось удалить поля _id и value из документа, чтобы иметь возможность использовать его как$setOnInsert.Что было допустимо.

Изменить на схему:

Теперь - я хотел переместить некоторые поля, включая value, во встроенный документ.Итак, моя схема документа теперь выглядит следующим образом:

{
  key: [string],
  data: {
    foo: [string],
    bar: [string],
    value: [number]
  }
}

Пытаясь использовать аналогичную идею для обновления, я пытаюсь это сделать:

db.collection.update(
  { key: "something unique" },
  {
    $max : { "data.value": 100 },
    $setOnInsert: {
      key: "something unique",
      data: {
        foo: "yes",
        bar: "probably"
      }
    }
  },
  { upsert: true }
)

Но это не сработает со следующим MongoError: Updating the path 'data' would create a conflict at 'data'.

Работает, но нелегко сконструировать:

Я мог бы заставить его работать с помощью точечной нотации:

db.collection.update(
  { key: "something unique" },
  {
    $max : { "data.value": 100 },
    $setOnInsert: {
      key: "something unique",
      "data.foo": "yes",
      "data.bar": "probably"
      }
  },
  { upsert: true }
)

Но программное построение этого обновления было бы немного беспорядочным, Я думаю.Тем не менее, некоторые примеры на C # приветствуются:)

Какой самый чистый и эффективный способ я могу достичь этой концепции условного обновления одного поля, но в то же время вставить полный документ, если он еще не существует?

Приветствуются другие подходы, кроме того, что я пытаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...