2013-07-09 4 views
5

У меня есть 2 осколка с наборами репликации (по 3 экземпляра каждый). Когда я делаю count() на собранной коллекции, я получаю намного больше, чем реальное количество документов (разница в 2,5 миллиона документов). То же самое, когда я просто делаю find() и увеличивая счетчик в цикле forEach().db.collection.count() возвращает намного больше документов для осколочной коллекции в MongoDB

Как узнать реальное количество документов? Прежде всего, я знаю тенденцию увеличения, т. Е. Она не может так сильно увеличиться. Во-вторых, когда я рассчитываю документы со следующим сценарием 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() в sharded среды https://jira.mongodb.org/browse/SERVER-3645 Но это действительно относится сосчитать() во время балансировки, то есть количества может рассчитывать куски, которые в настоящее время перемещаемых балансира. В качестве обходного пути эта ошибка предлагает поставить запрос, который всегда верен. Я тоже пробовал, но все же он возвращает счет, как и раньше.

+0

вы проверить, если запрос вставки/Updation является правильным (обмен, что было бы полезно)? – Sai

+0

Вы выполняете все запросы через монго, а не непосредственно против осколков, правильно? –

+0

@ Саи я проверю дважды вставку/обновление. –

ответ

-1

Попробуйте использовать более медленный (но, видимо, более точным) .itcount()

+0

1. itcount - это особенность драйвера java. ОП никогда не говорил, что они используют java 2. у него большой «только для тестирования!». предупреждение. – Philipp

+0

Я использовал его в оболочке. Просто не должно быть никакой документации. https://jira.mongodb.org/browse/DOCS-2147 – eric

Смежные вопросы