Koden ovan fungerar, min data var dålig. Som jag skrev i kommentaren ovan hade några av dokumenten isFoo som en sträng (inte boolesk) och det var därför jag såg de blandade resultaten.
Jag var tvungen att ändra fälttypen från String till Boolean så jag försökte detta:
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = new Boolean(x.isFoo); db.users.save(x); });
Men det gjorde bara alla isFoo-fält till objekt.
Eftersom jag var riktigt trött på att ta itu med det här problemet använde jag bara följande för att ställa in alla isFoo-fält på false och bara hantera ändringarna manuellt.
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = false; db.users.save(x); });
Det här var väldigt irriterande.