2016-01-15 16 views
8

Sto usando MongoDb 2.6.10 e uso C# Driver 1.9.2. Il server ha un replicaset di due server.La risposta di aggiornamento Mongo dice che nessun documento è stato aggiornato, ma il documento è lì

I miei documenti sono del formato. itemId è unico.

{ 
    "itemID": 2314, 
    "Favorites": [1, 24, 26, 34] 
} 

Poi Ho codice per rimuovere una preferita forma

var query = Query.EQ("itemID", itemId); 
var result = collection.Update(query, Update.Pull("Favorites", favoriteIdToRemove)); 

Dopo ogni volta, controllo che result.DocumentsAffected è uguale a 1. Di tanto in tanto, il valore ritorna come 0. Quando vado da solo a MongoDB, posso trovare il documento che corrisponde all'oggettoID, e posso vedere l'ID preferito che ha provato a rimuovere nell'array è ancora lì. result.OK è vero e non ci sono informazioni di errore.

Cosa potrebbe causare un errore?

+1

In genere, il problema riguarda i tipi non corrispondenti tra il documento e la richiesta di aggiornamento. Puoi modificare la tua domanda per fornire un esempio riproducibile specifico? – JohnnyHK

+0

Il problema è che non è riproducibile in modo coerente. In effetti, succede una volta ogni due giorni. Questo è il mio codice esatto e un documento di esempio. – Nikhil

risposta

1

Non sono esperto ma la mia ipotesi è di preoccupazione in scrittura poiché ci sono diversi livelli di garanzia per scrivere e aggiornare documenti in MongoDB. Vedere Write Concerns

Così, invece di utilizzare questo method:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate) 

Sarebbe meglio utilizzare questo method invece:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate, WriteConcern) 

e specificare il WriteConcern di essere

WriteConcern.WMajority 

In questo modo l'aggiornamento ha il guara più alto NTEE.

+0

Non tutte le operazioni di scrittura sono state eseguite sul server primario? – Nikhil

+0

Sì, tutte le operazioni di scrittura si verificano sul primario. Tuttavia, è possibile indicare al primario di attendere il riconoscimento di una scrittura riuscita finché N numero di secondari non ha replicato la scrittura. –

+0

Ci proverò. Tuttavia, se tutte le scritture sono sul primario, perché cambiare la preoccupazione di scrittura influisce sulla versione del documento? – Nikhil

0

C'è una possibilità che quando il documento esiste già ed è esattamente lo stesso del documento precedente, non saranno necessarie modifiche e quindi, la proprietà DocumentsAffected sarà 0. Puoi vedere la documentazione qui: https://docs.mongodb.org/manual/reference/method/WriteResult/#WriteResult. Puoi vedere queste proprietà nella proprietà Response del risultato.

+0

A meno che la mia richiesta per il documento sopra non sia corretta, sono certo che il documento avrebbe dovuto rimuovere un preferito. Quando controllo il documento usando MongoVUE, mostra il preferito che ho provato a rimuovere. – Nikhil

+0

Se è possibile creare in modo affidabile (o inaffidabile) una riproduzione, inviare un ticket SERVER su jira.mongodb.org. –

Problemi correlati