me gustaría estar seguro de que mis datos están en la base de datos después de la inserción y deshacer todo el lote si no se ha insertado un elemento .
Este es un tema complejo y hay varias concesiones que tiene que considerar aquí.
¿Debo usar sharding?
Sharding es para escalar escrituras. Para la seguridad de los datos, desea buscar un conjunto de réplica .
¿Debo usar algunos comandos específicos de mongoDB?
Lo primero a tener en cuenta es el modo "seguro" o "getLastError()" como indicado por Andreas. Si emite una escritura "segura", sabrá que la base de datos ha recibido la inserción y ha aplicado la escritura. Sin embargo, MongoDB solo se vacía en el disco cada 60 segundos, por lo que el servidor puede fallar sin los datos en el disco.
Lo segundo a tener en cuenta es "escribir en diario" (v1.8 +). Con el diario encendido, los datos se descargan al diario cada 100 ms. Entonces tienes un margen de tiempo más pequeño antes de la falla. Los controladores tienen una opción "fsync" (verifique ese nombre) que va un paso más allá de "safe", espera que se confirme que los datos tienen vacíos en el disco (es decir, el archivo de diario). Sin embargo, esto solo cubre un servidor. ¿Qué sucede si el disco duro en el servidor acaba muere? Bueno, necesitas una segunda copia.
Tercero a tener en cuenta es la replicación . Los controladores admiten un parámetro "W" que dice "replicar esta información en N nodos" antes de volver. Si la escritura no llega a Nodos "N" antes de un tiempo de espera determinado, la escritura falla (se produce la excepción ). Sin embargo, debe configurar "W" correctamente según el número de nodos en su conjunto de réplicas. Una vez más, debido a que un disco duro podría fallar, incluso con el diario, querrá ver la replicación. Luego hay una replicación en los centros de datos que es demasiado larga para obtener aquí. Lo último que debe considerar es su requerimiento de "rodar de vuelta". Desde mi entendimiento, MongoDB no tiene esta capacidad de "revertir" . Si está haciendo una inserción por lotes, lo mejor que obtendrá es una indicación de los elementos que fallaron.
Aquí hay un enlace al controlador PHP en este caso: http://it.php.net/manual/en/mongocollection.batchinsert.php Deberá verificar los detalles sobre la replicación y el parámetro W. Creo que las mismas limitaciones se aplican aquí.
Gracias por una muy buena y vasta respuesta. Esperaré por otras respuestas por algún tiempo y si no encuentro nada nuevo lo aceptaré, gracias –
tl; dr: ¡Estás jodido de cualquier manera! – Mrchief