2014-05-12 5 views
7

Cerco di ottenere tutti i valori distinti (meno di 10 valori possibili) di un determinato campo in una raccolta di grandi dimensioni (3.500.000 documenti, 35 GB).C'è un buon modo per ottenere valori distinti in grandi collezioni in Mongo?

Ho cercato di ottenere questi valori con un db.collection.distinct('field'), ma è molto lento, anche se c'è un indice (non sembra essere usato).

Qualche suggerimento per migliorare le prestazioni su questa query?

Grazie

Edit stavo usando Mongo 2.4.9. È stato corretto in 2.5.5 (https://jira.mongodb.org/browse/SERVER-2094), ma ho ancora un problema di prestazioni su query come questa db.logs.distinct("version", {wsId: "XXX" }) anche se gli indici esistono per entrambi i campi.

+0

puoi mostrare la struttura del documento, indicizzare e spiegare l'output – Sebastian

+0

Ho appena modificato la mia domanda. Sto usando una versione 2.4.9, sembra che le prestazioni siano state migliorate in 2.5.5. –

+0

Il documento archiviato è piuttosto semplice. È un documento senza campo nidificato, il campo (resultCode) ha un indice semplice. { "v": 1, "chiave": { "resultCode": 1} , "ns": "app_logs.logs", "name": "resultCode_1" } –

risposta

7

"distinto" utilizza l'indice se disponibile. Esegui come questo e vedere se l'indice è in uso:

db.runCommand({distinct: "collectionNameGoesHere", key:"fieldNameGoesHere"}) 

l'ultimo valore nel set di risultati restituito è statistiche che assomiglia a questo:

"stats" : { 
      "n" : 280, 
      "nscanned" : 280, 
      "nscannedObjects" : 0, 
      "timems" : 0, 
      "cursor" : "BtreeCursor class_id_1" 
    } 

Si noti che la mia domanda aveva usato un indice su il campo class_id da quando l'avevo pre-creato.

+1

Sebbene l'OP lo sappia già, la sua domanda è specifica per un sottoinsieme dell'indice di utilizzo distinto. – Sammaye

+0

Infatti, l'ho già fatto? Con un aggiornamento di Mongo, l'indice viene ora utilizzato se faccio una semplice query distinta, ma se aggiungo una condizione a questa query, le prestazioni sono terribili. –

+2

Ho usato db.runCommand ({distinct: "collectionNameGoesHere", chiave: "fieldNameGoesHere"}) ma ho ricevuto un messaggio di errore. eccezione errmsg: distinta troppo grande, 16mb cap –