db.collection.count () zwraca dużo więcej dokumentów dla sharded collection w MongoDB

Mam 2 odłamki z zestawami replikacji (po 3 instancje). Kiedy robięcount() w skąpej kolekcji dostaję znacznie więcej niż rzeczywista liczba dokumentów (różnica ponad 2,5 miliona dokumentów). Tak samo jak jafind() i inkrementacja licznika wforEach() pętla.

Jak poznać prawdziwą liczbę dokumentów? Po pierwsze, znam trend wzrostu, tj. Nie może on tak radykalnie wzrosnąć. Po drugie, gdy liczę dokumenty za pomocą następującego skryptu M / R, otrzymuję rzeczywistą liczbę dokumentów (jak zakładam). Używam tego skryptu, aby zobaczyć duplikaty dokumentów. Liczba duplikatów to kilka tysięcy, a nie miliony. I na tym liczyćtest_duplicate_collection minus duplikaty daje mi rzeczywistą liczbę dokumentów.

var map = function(){
   emit(this.doc_id, 1);
};

var reduce = function(key, values){
   var result = 0;
   values.forEach(function(value) {
     result += value;
   });

   return result;
};

db.test_collection.mapReduce(map, reduce, "test_duplicate_collection",null );

Teraz rozumiem, że podczas równoważenia może się zdarzyć, że niektóre kawałki nie zostaną jeszcze usunięte podczas przenoszenia ich do innego fragmentu. Ale widzę w statusie (sh.status()) że wszystkie porcje są równo rozłożone. Próbowałem również wstrzymać operacje zapisu, aby sprawdzić, czy zajmie to trochę czasu, ale nic się nie stało.

Można powiedzieć, że usuwanie przeniesionych fragmentów nadal trwa i rzeczywiście, gdy właśnie zacząłem używać shardingu, zauważyłem niewielkie spadki (bez operacji zapisu) dla sharded collection. Ale obecnie nie ma zmian w czasie, po prostu stoi w miejscu. Próbowałem również użyćorphanage.js z nadzieją znalezienia osieroconych dokumentów (przy użyciu skryptu zhttps://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I) ale nie znaleziono takich dokumentów.

Moje pytanie brzmi, co może być przyczyną tegocount() ifind().forEach() podać więcej niż rzeczywista liczba dokumentów (tj. vs skrypt M / R).

Doceniam Twoją pomoc.

EDIT1

Wystąpił problem z konfiguracją replikacji ustawionej w jednym z fragmentów. W szczególności nie ustawiono mastera w pliku konfiguracyjnym. W panelu MMS zamiastPrimary Zawsze widziałemSlave dla hosta, który został wysłany przez inne hosty replikacji. Kiedy to naprawiliśmy,forEach liczba pętli zaczęła pokazywać taką samą liczbę dokumentów jak w powyższym skrypcie M / R. Więc jedynym problemem jest obecniecount() samo.

W MongoDB JIRA znalazłem następujący nierozwiązany błąd z count () w sharded środowiskuhttps://jira.mongodb.org/browse/SERVER-3645 Ale to naprawdę odnosi się do count () podczas równoważenia, tj. Count może liczyć porcje, które są aktualnie przenoszone przez balancer. Jako obejście tego błędu proponuje umieszczenie zapytania, które jest zawsze prawdziwe. Próbowałem również, ale nadal zwraca liczbę jak poprzednio.

questionAnswers(1)

yourAnswerToTheQuestion