JSON e BSON possono solo codificare/decodificare stringhe UTF-8 valide, se i tuoi dati (incluso input) non sono UTF-8 devi convertirli prima di passarli a qualsiasi sistema dipendente da JSON, come questo:
$string = iconv('UTF-8', 'UTF-8//IGNORE', $string); // or
$string = iconv('UTF-8', 'UTF-8//TRANSLIT', $string); // or even
$string = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string); // not sure how this behaves
Personalmente preferisco la prima opzione, vedi iconv()
pagina manuale. Altre alternative includono:
mb_convert_encoding()
utf8_encode(utf8_decode($string))
Dovresti sempre assicurarti che le tue stringhe siano codificate in UTF-8, anche quelle inviate dall'utente, tuttavia, dal momento che hai menzionato che stai migrando da MySQL a MongoDB, hai provato a esportare il tuo database corrente in CSV e a utilizzare gli script di importazione forniti con Mongo? Dovrebbero occuparsene...
MODIFICA: Ho detto che BSON può gestire solo UTF-8, ma non sono sicuro che sia esattamente vero, ho una vaga idea che BSON usi UTF-16 o UTF-32 per codificare/decodificare i dati, ma non posso controllare ora.