2012-02-22 5 views
5

Korzystając z MongoDB i najnowszego sterownika C# 10 (CSharpDriver-1.3.1.4349), próbuję wykonać aktualizację "w miejscu" i odzyskać # dokumentów wykonanych w wyniku.SafeModeResult ma wartość null po aktualizacji

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; 
} 

Wynik jest z jakiegoś powodu zerowy. Gdybym robił to z konsoli, mogę dostać liczbę wierszy dokonane w ten sposób:

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

Każdy pomysł co robię źle czy jest to błąd w sterowniku C#?

Odpowiedz

6

Aktualizacja zawiera przeciążoną metodę, która zajmuje SafeMode. Wystarczy dodać go do kodu jako czwarty parametr do aktualizacji i nie powinna być zerowa:

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

To nie jest błąd kierowcy, to działa zgodnie z oczekiwaniami. Mongodb nie czeka na dokument, jeśli zostanie wstawiony bez trybu awaryjnego (dlatego zwrot null sterownika), ale jeśli mówisz "SafeMode = true" - zmuszasz mongodb do odkładania dokumentu.

+0

Dzięki! Wiem, jak działa tryb bezpieczny, ale błędnie założyłem, że połączenie domyślnie korzysta z trybu awaryjnego. – Justin

+0

Miałem ten sam problem, uważam, że obecny sterownik ma problem z uwierzytelnianiem podczas jawnego używania getLastError. Robert (dev na 10gen) zalecający użycie SafeMode.True zamiast do naprawienia prob. zobacz https://jira.mongodb.org/browse/CSHARP-390 – sambomartin

4

Wykonywanie wstawek i aktualizacji bez określania trybu awaryjnego daje wartość null, ponieważ są to operacje asynchroniczne - po prostu nie ma sposobu sprawdzenia, jak wstawiono aktualizację.

Dlatego dodaj np. SafeMode.True jako ostatni argument we wstawkach i aktualizacjach w przypadkach, gdy zależy Ci na wyniku. Spowoduje to, że kwestia kierowca polecenie getLastError, który blokuje aż wkładka/zaktualizowany zakończył:

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

można przeczytać coś więcej o getLastError i różne tryby here (general) bezpieczny i here (SafeMode with the C# driver).