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:
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;
}
Otrzymuję zmodyfikowaną liczbę, ale nadal nie jest ona zastępowana. Wciąż nikt nie ma odpowiedzi. Czy znalazłeś jakieś rozwiązanie? –
@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