MongoDB updateMany с условным - PullRequest
2 голосов
/ 12 мая 2019

У меня большая БД с различными несоответствиями.Один из пунктов, который я хотел бы прояснить, - это изменение статуса страны в зависимости от населения.

Пример данных:

{ "_id" : "D", "name" : "Deutschland", "pop" : 70000000, "country" : "Large Western" }
{ "_id" : "E", "name" : "Eire", "pop" : 4500000, "country" : "Small Western" }
{ "_id" : "G", "name" : "Greenland", "pop" : 30000, "country" : "Dependency" }
{ "_id" : "M", "name" : "Mauritius", "pop" : 1200000, "country" : "Small island"}
{ "_id" : "L", "name" : "Luxembourg", "pop" : 500000, "country" : "Small Principality" }

Очевидно, я бы хотел изменить странуполе переходит к чему-то более однородному, в зависимости от численности населения.

Я пробовал этот подход, но, очевидно, отсутствует какой-либо способ привязки к обновлению поля страны.

db.country.updateMany( { case : { $lt : ["$pop" : 20000000] }, then : "Small country" }, { case : { $gte : ["$pop" : 20000000] }, then : "Large country" }

Редактировать:Опубликовано до того, как я закончил писать.

Я думал использовать функциональность $cond, чтобы в основном возвращать, если true, делать X, если false, делать y, при использовании updateMany.

Isэто возможно или есть обходной путь?

1 Ответ

3 голосов
/ 12 мая 2019

Вы действительно хотите хотеть bulkWrite(), используя вместо этого два оператора "updateMany". Выражения агрегации нельзя использовать для «альтернативного выбора» в любой форме оператора обновления.

db.country.bulkWrite([
  { "updateMany": {
    "filter": { "pop": { "$lt": 20000000 } },
    "update": { "$set": { "country": "Small Country" } }
  }},
  { "updateMany": {
    "filter": { "pop": { "$gt": 20000000 } },
    "update": { "$set": { "country": "Large Country" } } 
  }}
])

На SERVER-6566 все еще имеется невыполненный "запрос функции" для "условного синтаксиса", но он еще не решен. «Массовый» API был фактически введен после того, как этот запрос был поднят, и действительно может быть адаптирован , как показано, чтобы сделать более или менее то же самое.

Также использование $out в операторе агрегации, как было предложено в противном случае, не является возможностью «обновить» и в настоящее время может выполнять запись только в «новую коллекцию». Планируемое изменение с MongoDB 4.2 и далее позволит $out фактически "обновить" существующую коллекцию, однако это будет только где обновляемая коллекция отличается от любой другой коллекции, используемой для сбора данных из конвейера агрегации. Поэтому невозможно использовать конвейер агрегации для обновления той же коллекции как того, из чего вы читаете.

Короче говоря, используйте bulkWrite().

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