У меня есть 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 Но это действительно относится сосчитать() во время балансировки, то есть количества может рассчитывать куски, которые в настоящее время перемещаемых балансира. В качестве обходного пути эта ошибка предлагает поставить запрос, который всегда верен. Я тоже пробовал, но все же он возвращает счет, как и раньше.
вы проверить, если запрос вставки/Updation является правильным (обмен, что было бы полезно)? – Sai
Вы выполняете все запросы через монго, а не непосредственно против осколков, правильно? –
@ Саи я проверю дважды вставку/обновление. –