2012-02-22 10 views
5

Utilizzando MongoDB e l'ultimo driver 10gen C# (CSharpDriver-1.3.1.4349), sto tentando di eseguire un aggiornamento "sul posto" e recuperare il numero di documenti effettati nel risultato.SafeModeResult è null dopo l'aggiornamento

public static long SaveListings(string state, bool isActive, DateTime updateDate) 
{ 
    var result = Collection().Update(
    Query.And(
     Query.EQ("State", state), 
     Query.And(
      Query.EQ("IsActive", isActive), 
      Query.LT("UpdateDate", updateDate))), 
    Update.Set("IsActive", false), UpdateFlags.Multi); 
    return result != null ? result.DocumentsAffected : -1; 
} 

Il risultato è nullo per qualche motivo. Se fossi facendo questo dalla console, ho potuto ottenere il numero di righe effettuato in questo modo:

db.Listing.update({ State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true); 
var numRows = db.getLastErrorObj().n; 

Qualsiasi idea di cosa sto facendo male o si tratta di un bug nel driver C#?

risposta

6

L'aggiornamento contiene un metodo sovraccarico che prende SafeMode. Basta aggiungere al vostro codice come quarto parametro per l'aggiornamento e dovrebbe essere non nullo:

... 
UpdateFlags.Multi, 
SafeMode.True); 

Questo non è il driver bug, funziona come previsto. Mongodb non attende il documento se viene inserito senza la modalità sicura (quindi il driver restituisce null), ma se si dice SafeMode = true - si forza mongodb attendere che il documento venga inserito.

+0

Grazie! So come funziona la modalità sicura, tuttavia ho assunto erroneamente che la connessione utilizza la modalità provvisoria per impostazione predefinita. – Justin

+0

Ho avuto lo stesso problema, ricorda che il driver corrente ha problemi con l'autenticazione quando usi getLastError in modo esplicito. Robert (dev con 10gen) consiglia di utilizzare SafeMode.True invece di correggere prob. vedere https://jira.mongodb.org/browse/CSHARP-390 – sambomartin

4

Fare inserimenti e aggiornamenti senza specificare la modalità provvisoria rende nulli perché sono operazioni asincrone - non c'è semplicemente modo di sapere come sono andati l'inserimento o l'aggiornamento.

Pertanto, aggiungere ad es. SafeMode.True come ultimo argomento negli inserti e negli aggiornamenti nei casi in cui ti interessa il risultato. Questo renderà il problema di driver un comando getLastError, che blocca fino a quando ha completato l'inserimento/aggiornamento:

var result = collection.Update(query, update, SafeMode.True); 

Si può leggere di più su alcuni getLastError e diverse modalità sicura here (general) e here (SafeMode with the C# driver).