Naprawdę chcesz bulkWrite()
używając dwóch "updateMany"
zamiast tego wypowiedzi w nim zawarte. Wyrażenia agregacji nie mogą być używane do „wyboru alternatywnego” w żadnej formie instrukcji aktualizacji.
db.country.bulkWrite([
{ "updateMany": {
"filter": { "pop": { "$lt": 20000000 } },
"update": { "$set": { "country": "Small Country" } }
}},
{ "updateMany": {
"filter": { "pop": { "$gt": 20000000 } },
"update": { "$set": { "country": "Large Country" } }
}}
])
Wciąż istnieje oczekująca „prośba o funkcję” na SERVER-6566 dla „składni warunkowej”, ale to nie zostało jeszcze rozwiązane. „Zbiorczy” interfejs API został faktycznie wprowadzony po zgłoszeniu tego żądania i naprawdę można go dostosować jak pokazano, aby zrobić mniej więcej to samo.
Również przy użyciu $out
w instrukcji agregacji, jak sugerowano inaczej, nie jest opcją „aktualizacji” i obecnie może pisać tylko do „nowej kolekcji”. Planowana zmiana z MongoDB 4.2 i nowszych pozwoliłaby $out
faktycznie „aktualizować” istniejąca kolekcja, jednak byłoby to tylko wtedy, gdy kolekcja, która ma zostać zaktualizowana, różni się od jakiejkolwiek innej kolekcji używanej w ramach gromadzenia danych z potoku agregacji. Więc nie jest to możliwe użyć potoku agregacji do aktualizacji tego samego kolekcja jako to, z czego czytasz.
W skrócie, użyj bulkWrite()
.