Используя 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 # приветствуются:)
Какой самый чистый и эффективный способ я могу достичь этой концепции условного обновления одного поля, но в то же время вставить полный документ, если он еще не существует?
Приветствуются другие подходы, кроме того, что я пытаюсь.