2015-09-17 2 views
7

Mam dziwne zachowanie przy użyciu sterownika C# dla MongoDB. Próbuję wykonać aktualizację, która zastępuje wiele pól, więc używam metody ReplaceOneAsync() z interfejsu API. Moje połączenia z dowolną kolekcją są wykonywane przy użyciu WriteConcern.Acknowledged, więc mogę obsługiwać przypadki, w których baza danych nie jest aktualizowana z jakiegokolwiek powodu (jak w tej sytuacji).ReplaceOne Metoda w filtrze Dopasuj dokument, nie wykonuje wymiany

Czasami baza danych nie aktualizuje rekordu, ale nie mogę określić, , dlaczego. Przy próbie debugowania tę sprawę patrzę obiektu ReplaceOneResult zwrócony z metody ReplaceOneAsync i pokazuje, że MatchedCount = 1, ale ModifiedCount = 0, jak widać na poniższym zrzucie ekranu z mojego debugger:

Debugging Screenshot

Jak to jest możliwe? Jeśli pasuje do jednego identyfikatora, który próbuję zastąpić, dlaczego nie wykonałby modyfikacji? Czy to oznacza, że ​​wystąpił jakiś stan błędu powodujący awarię w trybie cichym? Nie rzuca żadnych wyjątków, więc jeśli tak jest, jak mogę określić, co się dzieje?

Oto prosta metoda aktualizacji:

public virtual async Task<bool> Update(T entity) 
{ 
    if (entity.Id == ObjectId.Empty) 
     throw new ArgumentException("Id must be available and in the database to perform an update."); 

    ReplaceOneResult result = await this.MongoConnectionHandler.MongoCollection.ReplaceOneAsync(e => e.Id == entity.Id, entity); 
    return result.ModifiedCount > 0; 
} 
+0

Otrzymuję zmodyfikowaną liczbę, ale nadal nie jest ona zastępowana. Wciąż nikt nie ma odpowiedzi. Czy znalazłeś jakieś rozwiązanie? –

+0

@KalpeshChheda Nigdy nie wymyśliłem rozwiązania tego problemu ani nie zdecydowałem, co dzieje się za kulisami. Aplikacja, nad którą pracowałem, faktycznie przestała używać mongodb, więc nigdy nie zadałem sobie trudu, aby kontynuować badanie tego problemu, gdy straciłem na wartości. – JNYRanger

Odpowiedz

1

Jeśli MatchedCount = 1 i = 0 ModifiedCount powinno być, ponieważ dokument jest identyczny zamiennik do istniejącego dokumentu.

Dopasowano, ale nie było konieczności wymiany, ponieważ były identyczne.