Výše uvedený kód funguje, moje data byla špatná. Jak jsem napsal v komentáři výše, některé dokumenty měly isFoo jako řetězec (ne booleovský), a proto jsem viděl smíšené výsledky.
Musel jsem změnit typ pole z String na Boolean, takže jsem zkusil toto:
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = new Boolean(x.isFoo); db.users.save(x); });
Ale to právě změnilo všechna pole isFoo na objekty.
Vzhledem k tomu, že jsem byl opravdu unaven řešením tohoto problému, použil jsem následující k nastavení všech polí isFoo na hodnotu false a změny jsem provedl ručně.
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = false; db.users.save(x); });
To bylo velmi nepříjemné.