Estaba yo haciendo mis pruebas con MongoDB cuando he reparado que el campo “_id” de todas mis colecciones está vacío. Para el que no lo sepa, todos los documentos en MongoDB (y en otras bases de datos NOSQL como CouchDB) tienen que tener un campo “_id” que consiste en 24 caracteres hexadecimales, viniendo a ser como el `id`autonumérico de las bases relacionales.
Bueno, parece ser el driver de PHP sólo nos deja contar con el campo “_id” si llamamos explícitamente a new MongoId() haciendo un $_id= new MongoId($_id);, como bien se explica en http://php.net/manual/en/mongoid.construct.php
Vale, bien, ese no era el problema, el problema era que aún haciendo esto, mi campo “_id” seguía vacío.
Bueno, pues parece que se hace el lío el sólo al hacer el cast a JSON y como ya no le parece una cadena en hexadecimal, lo ignora.
SOLUCIÓN:

$data['_id'] = $data['_id']."";

antes de hacer el insert.
Atentos al .”" porque con eso nos aseguramos de que lo toma como cadena y, entonces, ya nos mete el “_id” correctamente.

Os dejo algunos ejemplos de mi código funcionando correctamente los inserts usando simplemongophp:
array('name' => 'prueba', 'password' => 'prueba', 'creation' => time(), 'role'=> 1, '_id' => new MongoId()."")
para el ejemplo del post anterior quedaría así:
foreach ($row as $k => $v){
$_[_id]= new MongoId().”";
$_[$k] = utf8_encode ($v);
}

Db::batchInsert(‘prueba’,array($_));