Обновление всех значений массива toUpper через collection.update в MongoDB - PullRequest
2 голосов
/ 03 мая 2020

Пн go shell> db.version: 4.2.6

Попытка обновить все документы в коллекции с помощью: массива категорий []. ["value1", "value2"] в ["VALUE1", "VALUE2"] При использовании заполнителя $[e]

Можно использовать небольшую справку о том, как переписать ниже, или объяснение. спасибо.

db.Article.update( {},{ $set :{ "categories.$[e]" : { $toUpper: "e"  }}},{ multi: true, arrayFilters : [ {"e" : { $regex:'.+'  } } ]} )

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 52,
                "errmsg" : "The dollar ($) prefixed field '$toUpper' in 'categories.0.$toUpper' is not valid for storage."
        }
})

1 Ответ

2 голосов
/ 03 мая 2020

Запуск версии MongoDB> = 4.2 Операции обновления в MongoDB могут выполнять конвейер агрегации в них, проверьте: update-with-ag-aggregation-pipeline . Таким образом, вы можете попробовать следующий запрос:

db.Article.update(
  { $expr: { $eq: [{ $type: "$categories" }, "array"] } }, // Condition that checks `categories` exists & is an array.
  [
    {
      $set: {
        categories: {
          $map: {
            input: "$categories",
            in: { $toUpper: "$$this" }
          }
        }
      }
    }
  ],
  { multi: true }
);

На всякий случай, если пара ваших элементов в массиве categories не имеет типа string (Если массив categories представляет собой смесь чисел & strings) тогда в in части $map вы можете иметь условие, такое как: * {$cond : [{$eq : [{$type : '$$this'},'string']},{ $toUpper: "$$this" } ,'$$this']}

Test: Тестировать конвейер агрегации здесь: mongoplayground

Примечание: Вы можете использовать .updateMany() вместо .update() с опцией {multi : true}.

...