Esta exceptción es causada por el acceso a un cursor de forma incorrecta o en un error al recibir
una réplica. Obsérvese que esta excepción puede ser lanzada por cualquier petición a la base de
datos que reciba una réplica, no solamente consultas. Las escrituras, comandos y cualquier otra
operación que envie información a la base de datos y espere una respuesta, puede lanzar una
MongoCursorException. La única excepción es
new MongoClient() (crear una nueva conexión), la cual solamente
lanzará MongoConnectionExceptions.
Devuelve un mensaje de error específico para ayudar a diagnosticar el problema, y un
código de error numérico asociado con la causa de la excepción.
Por ejemplo, suponga que se intentan insertar dos documentos con el mimo _id:
<?php
try {
$collection->insert(array("_id" => 1), array("w" => 1));
$collection->insert(array("_id" => 1), array("w" => 1));
}
catch (MongoCursorException $e) {
echo "error message: ".$e->getMessage()."\n";
echo "error code: ".$e->getCode()."\n";
}
?>
mensaje de error: E11000 duplicate key error index: foo.bar.$_id_ dup key: { : 1 }
código del error: 11000
Obsérvese que el código de error de MongoDB (11000) se usa para el código de error de PHP. El
controlador de PHP utiliza el código de error "nativo" siempre que sea posible.
La lista siguietne contiene errores comunes y sus causas. Los mensajes de error exactos están
en cursiva; los errores donde el mensaje puede variar están descritos entre barras oblicuas.
-
cannot modify cursor after beginning iteration (no se puede modificar el cursor después de iniciar una iteración)
Código: 0
Se está invocando a un método que configura la consulta después de ejecutarla.
Reinice el cursor y vuelva a intentarlo.
Un ejemplo:
<?php
try {
$cursor = $colección->find();
var_dump($cursor->getNext());
// getNext() consulta a la base de datos, es demasiado tarde para establecer un límite
$cursor->limit(1);
}
catch (MongoCursorException $e) {
echo "mensaje de error: ".$e->getMessage()."\n";
echo "código del error: ".$e->getCode()."\n";
}
// si bien, esto funcionará:
$cursor->getNext();
$cursor->reset();
$cursor->limit(1);
?>
-
La obtención del siguiente lote envía errores
Código: 1
Podría no enviarse la consulta a la base de datos. Asegúrese de que la base de datos
aún está activa y la red funciona bien.
-
cursor not found (cursor no encontrado)
Código: 2
El controlador estuvo intentando obtener más resultados de la base de datos, pero
ésta no tiene un registro de la consulta. Esto usualmente significa que el
cursor a expirado en el lado del servidor: después de unos pocos minutos de inactividad,
la base de datos destruirá un cursor (véase
MongoCursor::immortal() para información sobre cómo prevenir
esto).
Un ejemplo:
<?php
try {
$cursor = $colección->find();
$cursor->getNext();
// dormir durante 15 minutos
sleep(60*15);
while ($cursor->hasNext()) {
$cursor->getNext();
}
}
catch (MongoCursorException $e) {
echo "mensaje de error: ".$e->getMessage()."\n";
echo "código del error: ".$e->getCode()."\n";
}
?>
-
cursor->buf.pos is null (cursor->buf.pos es null)
Código: 3
Esto podría indicar que se ha quedado sin RAM o alguna otra circunstancia
extraordinaria.
-
couldn't get response header (no se pudo obtener la cabecera de respuesta)
Código: 4
Un error común si la base de datos o la red se caen. Esto significa que el
controlador podría no obtener una respuesta de la conexión.
-
no db response (sin resupesta de la base de datos)
Código: 5
Esto podría incluso no ser un error, por ejemplo, el comando de base de datos
"shutdown" no devuelve respuesta alguna. Sin embargo, si se espera una
respuesta, esto significa que la base de datos no proporcionó ninguna.
-
bad response length: %d, did the db assert? (longitud de respuesta errónea: %d, ¿se declaró la bd?
Código: 6
Esto significa que la base de datos indica que su respuesta fue menor que 0. Este
error probablemente indica un error de red o corrupción de la base de datos.
-
incomplete header (cabecera incompleta)
Código: 7
Muy poco usual. Ocurre si la respuesta de la base de datos se inicia correctamente,
pero se interrumpe a la mitad. Probablemente indica un problema de red.
-
incomplete response (respuesta incompleta)
Código: 8
Muy poco usual. Ocurre si la respuesta de la base de datos se inicia correctamente,
pero se interrumpe a la mitad. Probablemente indica un problema de red.
-
couldn't find a response (no se pudo encontrar una respuesta)
Código: 9
Si la respuesta fue almacenada en caché y ahora no se puede localizar.
-
error getting socket (error al obtener el socket)
Código: 10
El socket fue cerrado o se encontró con un error. El controlador debería
reconectar automáticamente (si es posible) en la siguiente operación.
-
couldn't find reply, please try again (no se pudo encontrar la réplica, inténtelo de nuevo)
Código: 11
El controlador guarda cualquier respuesta de la base de datos que no pudo hacer coincidir inmediatamente con una
petición. Esta excepción ocurre si el controlador ya ha pasado la
respuestta de la petición y no puede encontrarla en su caché.
-
error getting database response: errstr (error al obtener una respuesta de la base de datos: errstr)
WSA error getting database response: errstr (error WSA al obtener una respuesta de la base de datos: errstr)
"errstr" es un error de E7S reportado directamente desde el subsistema de sockets
de C. En Windows, el mensaje de error está prefijado con "WSA".
-
Timeout error (Error de tiempo de espera)
Código: 13
Si hubo un error mientras se esperaba a que se completase una consulta.
-
couldn't send query: <various> (no se pudo enviar la consulta: <variado>)
Código: 14
Error del socket de C en el envío.
-
max number of retries exhausted, couldn't send query (número máximo de reintentos agotados, no se pudo enviar la consulta)
Código: 19
El controlador automáticamente reintentará realizar consultas "planas" (no comandos) un
par de veces si el primer intento falló por ciertas razones. Esto es para causar menos
excepciones durante la tolerancia a fallos del conjunto de réplicas (aunque probablemente
aún tendrá que tratar con alguna) y pasar por alto asuntos de red
transitorios.
Esto también puede ser causado porque el controlador no es capaz de reconectar de ningún modo a la
base de datos (si, por ejemplo, la base de datos está ilocalizable).
Versión 1.2.2+.