2013-02-15 14 views
9

In base al metodo javaDoc, getN() della classe WriteResult in MongoDB-java restituisce il numero di documenti aggiornati nell'operazione. Ma restituisce sempre zero, anche se il documento è stato inserito correttamente.MongoDB: WriteResult.getN() restituisce sempre 0?

Perché così? o l'ho capito male?

+0

Funziona correttamente. Quale versione di mongo stai usando? I documenti sono stati inseriti correttamente nel DB dopo questa operazione? – Buchi

+1

sì i documenti sono stati inseriti correttamente! Versione Mongo: 2.2.2 –

+1

Anche io trovo la stessa cosa. Restituisce 0. Vedi anche http: // StackOverflow.it/questions/10662858/mongodb-java-api-writeresultgetn – btiernay

risposta

9

ho avuto l'impressione che questo era il normale comportamento MongoDB, e non ha nulla a fare con il driver Java.

L'unica cosa che posso trovare nella documentazione è this:

getLastError.n riporta il numero di documenti aggiornati o rimossi, se l'operazione precedente era un aggiornamento o rimuovere il funzionamento.

Un insert essendo né un updateremove, n non sembra essere specificato e 0 è un buon valore predefinito come qualsiasi. È possibile controllare abbastanza facilmente nella shell mongo:

> db.test.insert({_id: 'test'}) 
> db.getLastErrorObj() 
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 } 

A meno che non mi sbaglio, non è davvero un problema: chiedetevi in ​​quali circostanze l'inserto fallirebbe (altro rispetto, ad esempio, un errore di connessione). L'unica a cui riesco a pensare è una violazione del vincolo di unicità, che comporterebbe un'eccezione. Quindi, quasi per definizione, il fatto che tu riceva un'istanza WriteResult significa che l'operazione è andata a buon fine e che è stato inserito un documento.

Un paio di note:

  • mia tesi precedente cerniere sul tuo WriteConcern essere abbastanza alto che gli errori vengono segnalati. Ad esempio, se si utilizza WriteConcern.NONE, non verrà mai generata alcuna eccezione.
  • se il numero di documenti aggiornati è assolutamente necessario, è sempre possibile utilizzare save anziché insert. Non molto pulito, ma si comporta come ti aspetti.
+2

Penso che ci sia un problema con questo comportamento, perché Javadoc per 'getN()' dice "* Ottiene il campo" n ", che contiene il numero di documenti interessati nell'operazione di scrittura. *. Se si esegue un [non ordinato insert] (http://docs.mongodb.org/manual/reference/method/db.collection.insert/#perform-an-unordered-insert), è utile sapere se qualcosa è cambiato e usare 'getN() 'quindi introduce un bug nella tua applicazione restituendo sempre 0. Una soluzione ragionevole (oltre a correggere Javadoc) potrebbe essere quella di fare in modo che getN()' lanci un'eccezione per gli inserti, o non includa il metodo in primo luogo! – Zero3

+0

@ Zero3 Inserti non ordinati sono più recenti di questa risposta Additionaly, WriteResult include il numero di documenti inseriti dal 2.6, credo che sia sufficiente chiamare getField con il nome giusto.Infine, il javadoc più recente non dice nulla di ciò che è il campo n, dice semplicemente 'prendi il campo n'. Anche se non è molto utile, è difficilmente corretto. E se si guarda la documentazione ufficiale di mongodb per il campo n, è abbastanza chiaro che gli inserti produrranno un valore n di 0 - forse non il comportamento migliore, ma quello corretto secondo le specifiche. Basta usare il campo corretto. –

+0

[WriteResult] (http://api.mongodb.org/java/current/com/mongodb/WriteResult.html) non ha tale funzionalità nell'ultima versione e la descrizione di 'getN()' è esattamente come ho scritto . Controlla tu stesso :). – Zero3

4

Nota che, indipendentemente da ciò che la MongoDB documentation Stati, il metodo WriteResult.getN() restituisce sempre 0 per l'inserimento utilizzando il driver Java, indipendentemente dal numero di oggetti inseriti. Il codice sorgente per l'impostazione del campo "n" nel 2.12.3 del driver Java:

if (type == INSERT) { 
    commandResult.put("n", 0); 
} else if (type == REMOVE) { 
    commandResult.put("n", bulkWriteResult.getRemovedCount()); 
} else if (type == UPDATE || type == REPLACE) { 
    commandResult.put("n", bulkWriteResult.getMatchedCount() + bulkWriteResult.getUpserts().size()); 
    if (bulkWriteResult.getMatchedCount() > 0) { 
    commandResult.put("updatedExisting", true); 
    } else { 
    commandResult.put("updatedExisting", false); 
    } 
    if (!bulkWriteResult.getUpserts().isEmpty()) { 
    commandResult.put("upserted", bulkWriteResult.getUpserts().get(0).getId()); 
    } 
} 

Ma gli errori vengono correttamente segnalata tramite eccezioni. Ad esempio, verrà generata una MongoException quando si inserisce un documento che viola un indice univoco, se WriteConcern specificato è almeno il ACKNOWLEDGED

Problemi correlati