2016-01-15 40 views
8

Używam programu MongoDb 2.6.10 i programu C# Driver 1.9.2. Serwer ma replikę dwóch serwerów.Odpowiedź aktualizacji Mongo mówi, że żaden dokument nie został zaktualizowany, ale dokument jest tam

Moje dokumenty mają format. itemId jest unikalny.

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

Wtedy mam kod, aby usunąć ulubione formy

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

Po każdym czasie sprawdzić, że result.DocumentsAffected jest równy 1. raz na jakiś czas, wartość wraca jako 0. Kiedy sam wchodzę na MongoDB, mogę znaleźć dokument pasujący do itemID i widzę, że ulubiony identyfikator, który próbował usunąć w tablicy, nadal tam jest. Wynik.OK jest prawdziwy i nie ma informacji o błędzie.

Co może spowodować awarię?

+1

Zwykle problemem są niedopasowane typy między dokumentem a żądaniem aktualizacji. Czy możesz edytować swoje pytanie, aby podać konkretny powtarzalny przykład? – JohnnyHK

+0

Problem polega na tym, że nie jest on powtarzalny. W rzeczywistości zdarza się to raz na kilka dni. To jest mój dokładny kod i przykładowy dokument. – Nikhil

Odpowiedz

1

Nie jestem ekspertem, ale domyślam się, że jest to problem związany z pisaniem, ponieważ istnieją różne poziomy gwarancji na pisanie i aktualizowanie dokumentów w MongoDB. Zobacz Write Concerns

Więc zamiast używać tego method:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate) 

To może być lepiej użyć tego method Zamiast:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate, WriteConcern) 

i określ WriteConcern być

WriteConcern.WMajority 

W ten sposób aktualizacja ma najwyższą wartość Ntee.

+0

Czy nie wszystkie operacje zapisu są wykonywane na serwerze głównym? – Nikhil

+0

Tak, wszystkie operacje zapisu mają miejsce na serwerze głównym. Możesz jednak nakazać elementowi głównemu, aby oczekiwał na potwierdzenie pomyślnego zapisu, dopóki liczba kopii wtórnych N nie zostanie zreplikowana. –

+0

Spróbuję tego. Jeśli jednak wszystkie zapisy dotyczą wersji podstawowej, dlaczego zmiana zapisu ma wpływ na wersję dokumentu? – Nikhil

0

Istnieje możliwość, że gdy dokument już istnieje i jest dokładnie taki sam jak poprzedni dokument, żadne zmiany nie będą potrzebne, a zatem właściwość DocumentsAffected będzie miała wartość 0. Dokumentację można zobaczyć tutaj: https://docs.mongodb.org/manual/reference/method/WriteResult/#WriteResult. Możesz zobaczyć te właściwości we właściwości Response wyniku.

+0

Jeśli moje zapytanie do powyższego dokumentu nie jest poprawne, jestem pewien, że dokument powinien usunąć ulubiony element. Kiedy sprawdzam dokument za pomocą MongoVUE, pokazuje ulubione, które próbowałem usunąć. – Nikhil

+0

Jeśli możesz niezawodnie (lub niesolidnie) utworzyć reprodukcję, zgłoś bilet SERVER na stronie jira.mongodb.org. –