db.collection.count () возвращает намного больше документов для коллекций в ShongoDB
У меня есть 2 осколка с наборами репликации (3 экземпляра каждый). Когда я делаюcount()
в закрытой коллекции я получаю намного больше, чем реальное количество документов (разница в более чем 2,5 миллиона документов). То же самое, когда я просто делаюfind()
и увеличивая счетчик вforEach()
петля.
Как узнать реальное количество документов? Во-первых, я знаю тенденцию роста, то есть она не может возрастать так радикально. Во-вторых, когда я считаю документы с помощью следующего сценария M / R, я получаю реальное количество документов (как я предполагаю). Я использую этот скрипт, чтобы увидеть дубликаты документов. Количество дубликатов составляет несколько тысяч, а не миллионов. И рассчитывать наtest_duplicate_collection
минус дубликаты дает мне реальное количество документов.
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 );
Теперь я понимаю, что во время балансировки может случиться так, что некоторые чанки еще не будут удалены при переносе их в другой осколок. Но я вижу в статусе (sh.status()
) что все куски распределены одинаково. Я также попытался приостановить операции записи, чтобы узнать, занимает ли это какое-то время, но ничего не произошло.
Вы могли бы сказать, что удаление перемещенных фрагментов все еще продолжается, и, действительно, когда я только начал использовать шардинг, я увидел небольшое уменьшение (без операций записи) для сегментированного сбора. Но в настоящее время никаких изменений с течением времени нет, они просто стоят на месте. Я пытался также использоватьorphanage.js
с надеждой найти осиротевшие документы (используя скрипт изhttps://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I) но таких документов найдено не было.
Мой вопрос в том, что может быть причиной того, чтоcount()
а такжеfind().forEach()
дать больше, чем реальное количество документов (то есть против сценария M / R).
Ценю твою помощь.
EDIT1
Возникла проблема с настройкой набора репликации в одном из сегментов. В частности, мастер не был установлен в файле конфигурации. В панели инструментов MMS вместоPrimary
Я всегда виделSlave
для хоста, который прослушивался другими хостами репликации. Когда мы это исправили,forEach
Счетчик циклов начал показывать то же количество документов, что и в сценарии M / R выше. Таким образом, единственная проблема в настоящее время сcount()
сам.
В MongoDB JIRA я обнаружил следующую неразрешенную ошибку с count () в защищенной средеhttps://jira.mongodb.org/browse/SERVER-3645 Но это действительно относится к count () во время балансировки, то есть count может подсчитывать фрагменты, которые в данный момент перемещаются балансировщиком. В качестве обходного пути эта ошибка предлагает поставить запрос, который всегда верен. Я попробовал это также, но все равно это возвращает счет как прежде.