2012-05-19 11 views
10

Escribo código Java usando MongoDB con Java API y no estoy seguro de alguna parte del Javadoc.Mongodb java api: WriteResult # getN()

En un contexto multi-thread utilizo DBCollection.html#update(com.mongodb.DBObject, com.mongodb.DBObject) para actualizar un documento único, pero vi que dos hilos podrían intentar escribir al mismo tiempo. En este contexto, observé que solo se realizó una escritura, ya que Mongodb parece usar el bloqueo de escritura optimista, pero quería averiguar programáticamente en qué hilo la escritura era la que escribía, y cuál no. Como un comportamiento "no hay ninguna actualización" se quedó en silencio (me refiero no es una excepción o algo así), me buscaron en la API de alguna manera de responder a mi problema y después de algunas pruebas se enteraron de este método: WriteResult#getN()

public int getN() 
    Gets the "n" field 
    Returns: 

La descripción es, hum ... no realmente exhaustivo. Mis pruebas mostraron que el hilo que gana la escritura tiene un getN() que devuelve 1, y el otro 0.

Así que mi pregunta es: ¿alguien podría confirmar esto?

+1

¿por qué dice que hubo un "error"? si no se encontró el objeto especificado, no hubo nada que actualizar. No habría ninguna actualización, no una falla de escritura. –

+0

Lo siento, como un hablante de inglés no nativo, alguna vez no puedo decir lo que pienso de la manera correcta. ;) Quise decir que no se actualizó en silencio, que era mi problema en realidad. Corregiré mi redacción. – Nicocube

Respuesta

8

Desde el GetLastError() documentation

El valor de retorno del comando es un objeto con varios campos. Los campos comunes se enumeran a continuación; también puede haber otros campos.

  • ok - true indica que el comando getLastError se completó correctamente. Esto NO indica que no hubo un último error.
  • err - si no es nulo, indica que se ha producido un error. El valor es una descripción textual del error.
  • código
  • - si está configurado, indica el código de error que ocurrió. ID de conexión - el identificador de la conexión
  • lastOp - el op-id desde la última operación

Para actualizaciones:

  • n - si hay una actualización fue hecho, este es el número de documentos actualizados .

Por lo tanto, en este contexto, 'obtener' n "campo 'significa obtener n cuál es el número de documentos actualizados. Sin que "multi" se establezca en verdadero, solo puede ser 0 o 1.

+0

Gracias por encontrar esta información, ahora estoy seguro de mi algoritmo.^_ ^ – Nicocube