Opravdu chcete bulkWrite()
pomocí dvou "updateMany"
prohlášení v něm. Agregační výrazy nelze použít k provedení "alternativního výběru" v žádné formě příkazu aktualizace.
db.country.bulkWrite([
{ "updateMany": {
"filter": { "pop": { "$lt": 20000000 } },
"update": { "$set": { "country": "Small Country" } }
}},
{ "updateMany": {
"filter": { "pop": { "$gt": 20000000 } },
"update": { "$set": { "country": "Large Country" } }
}}
])
Na SERVER-6566 stále existuje nevyřízený „žádost o funkci“ pro "podmíněnou syntaxi", ale to ještě není vyřešeno. „Hromadné“ API bylo ve skutečnosti představeno po vznesení tohoto požadavku a skutečně jej lze přizpůsobit jak je znázorněno udělat více či méně to samé.
Také pomocí $out
v prohlášení o agregaci, jak bylo jinak navrženo, není možnost "aktualizovat" a v současné době může psát pouze do „nové sbírky“. Očekávaná změna od MongoDB 4.2 výše by umožnila $out
skutečně "aktualizovat" existující sbírku, nicméně to by bylo pouze v případě, že se kolekce, která má být aktualizována, liší od jakékoli jiné kolekce používané při shromažďování dat z agregačního kanálu. Takže to není možné pomocí agregačního kanálu k aktualizaci stejného kolekce jako to, z čeho čtete.
Stručně řečeno, použijte bulkWrite()
.