db.collection.count () retorna muito mais documentos para a coleção sharded no MongoDB
Eu tenho 2 shards com conjuntos de replicação (3 instâncias cada). Quando eu façocount()
em uma coleção fragmentada, recebo muito mais do que o número real de documentos (mais de 2,5 milhões de diferença de documentos). O mesmo quando eu façofind()
e incremento contador emforEach()
loop.
Como eu sei o número real de documentos? Primeiro de tudo, eu sei a tendência de aumento, ou seja, não pode aumentar de forma tão radical. Em segundo lugar, quando conto documentos com o seguinte script M / R, recebo um número real de documentos (como presumo). Eu uso esse script para ver documentos duplicados. O número de duplicatas é de vários milhares, não de milhões. E a contagem emtest_duplicate_collection
menos duplicatas me dá um número real de documentos.
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 );
Agora, eu entendo que, durante o balanceamento, pode acontecer que alguns fragmentos não sejam excluídos ainda durante a transferência para outro fragmento. Mas vejo no status (sh.status()
) que todos os pedaços são igualmente distribuídos. Eu também tentei pausar as operações de gravação para ver se leva algum tempo, mas nada aconteceu.
Você pode dizer que a exclusão de partes movidas ainda está ocorrendo e, de fato, quando comecei a usar o particionamento, vi pequenas diminuições (sem operações de gravação) para a coleção fragmentada. Mas atualmente, não há mudança ao longo do tempo, apenas fica parado. Eu também tentei usarorphanage.js
com a esperança de encontrar documentos órfãos (usando o script dehttps://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I) mas esses documentos não foram encontrados.
Minha pergunta é qual pode ser a razão pela qualcount()
efind().forEach()
dar mais do que o número real de documentos (ou seja, vs script M / R).
Agradeço sua ajuda.
EDIT1
Houve um problema com a configuração do conjunto de replicação em um dos shards. Especificamente, nenhum mestre foi definido no arquivo de configuração. No painel do MMS em vez dePrimary
Eu sempre viSlave
para o host que foi ouvido por outros hosts de replicação. Quando consertamos isso,forEach
A contagem de loop começou a mostrar o mesmo número de documentos que no script M / R acima. Então, o único problema atualmente é com ocount()
em si.
No MongoDB JIRA eu encontrei o seguinte bug não resolvido com count () no ambiente shardedhttps://jira.mongodb.org/browse/SERVER-3645 Mas isso realmente se relaciona com count () durante o balanceamento, ou seja, a contagem pode contar partes que atualmente são movidas pelo balanceador. Como uma solução alternativa, este bug propõe colocar a consulta que é sempre verdadeira. Eu tentei também, mas ainda assim ele retorna como antes.