2013-07-09 15 views
5

Ho 2 frammenti con set di repliche (3 istanze ciascuno). Quando faccio lo count() su una raccolta più dettagliata, ottengo molto più del numero reale di documenti (più di 2,5 milioni di documenti). Lo stesso quando faccio solo il find() e il contatore incrementale nel ciclo forEach().db.collection.count() restituisce molti più documenti per la raccolta in MongoDB in MongoDB

Come faccio a sapere il numero reale di documenti? Prima di tutto, conosco la tendenza all'aumento, cioè non può aumentare in modo così radicale. In secondo luogo, quando conto i documenti con il seguente script M/R, ottengo un numero reale di documenti (come presumo). Io uso questo script per vedere i documenti duplicati. Il numero di duplicati è di diverse migliaia e non di milioni. E il conteggio su test_duplicate_collection meno i duplicati mi fornisce un numero reale di documenti.

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); 

Ora, capisco che durante il bilanciamento può accadere che alcuni pezzi non sono ancora cancellati, mentre il loro trasferimento ad un altro frammento. Ma vedo nello stato (sh.status()) che tutti i blocchi sono equamente distribuiti. Ho anche provato a mettere in pausa le operazioni di scrittura per vedere se ci vuole del tempo, ma non è successo nulla.

Si potrebbe dire che la cancellazione di blocchi spostati è ancora in corso, e in effetti quando ho iniziato a usare il frammento ho visto una leggera diminuzione (senza operazioni di scrittura) per la raccolta più grande. Ma al momento, non vi è alcun cambiamento nel tempo, rimane immobile. Ho provato anche a usare orphanage.js con la speranza di trovare documenti orfani (usando lo script da https://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I) ma non sono stati trovati documenti di questo tipo.

La mia domanda è quale può essere la ragione per cui count() e find().forEach() forniscono più del numero reale di documenti (cioè rispetto allo script M/R).

Apprezzo il tuo aiuto.

EDIT1

C'è stato un problema con la configurazione della replica impostato in uno dei frammenti. Nello specifico, nessun master è stato impostato nel file di configurazione. Nella dashboard MMS anziché Primary ho sempre visto Slave per l'host che è stato ascoltato da altri host di replica. Quando lo abbiamo risolto, il conteggio del loop forEach ha iniziato a mostrare lo stesso numero di documenti dello script M/R sopra. Quindi l'unico problema attualmente è con lo count() stesso.

In MongoDB JIRA Ho trovato il seguente problema irrisolto con count() in ambiente sharded https://jira.mongodb.org/browse/SERVER-3645 Ma riferisce davvero a contare() durante il bilanciamento, ossia conteggio può contare pezzi che sono attualmente mossi dalla equilibratrice. Come soluzione, questo bug propone di mettere una query che è sempre vera. Ho provato anche io ma continua a contare come prima.

+0

Hai controllato se la query di inserimento/updation è corretto (condivisione che sarebbe utile)? – Sai

+0

Stai eseguendo tutte le query tramite mongos e non direttamente contro i frammenti, corretto? –

+0

@Sai Verificherò nuovamente l'inserimento/l'aggiornamento. –

risposta

-1

Provare a utilizzare il più lento (ma apparentemente più accurato) .itcount()

+0

1. itcount è una funzionalità speciale del driver java. L'OP non ha mai detto che stavano usando java 2. ha un grande "solo per i test!" avvertimento. – Philipp

+0

L'ho usato nella shell. Non devo ancora avere alcuna documentazione. https://jira.mongodb.org/browse/DOCS-2147 – eric

Problemi correlati