Il codice sopra funziona, i miei dati erano cattivi. Come ho scritto nel commento sopra, alcuni documenti avevano isFoo come stringa (non booleana) ed è per questo che vedevo i risultati contrastanti.
Ho dovuto cambiare il tipo del campo da String a Boolean, quindi ho provato questo:
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = new Boolean(x.isFoo); db.users.save(x); });
Ma questo ha appena trasformato tutti i campi isFoo in Oggetti.
Dato che ero davvero stanco di affrontare questo problema, ho appena usato quanto segue per impostare tutti i campi isFoo su false e gestire le modifiche manualmente.
db.users.find( { 'isFoo' : { $exists : true } } ).forEach( function (x) { x.isFoo = false; db.users.save(x); });
Questo è stato molto fastidioso.