Come eseguire in modo efficiente “distinti” con più chiavi?

Ad esempio, esiste una raccolta come questa:

{market: ‘SH’, codice: ‘000001’, data: ‘2012-01-01’, prezzo: 1000}
{market: ‘SZ’, codice: ‘000001’, data: ‘2012-01-01’, prezzo: 1000}
{market: ‘SH’, codice: ‘000001’, data: ‘2012-01-02’, prezzo: 1000}
{market: ‘SZ’, codice: ‘000001’, data: ‘2012-01-02’, prezzo: 1000}
{market: ‘SH’, codice: ‘000002’, data: ‘2012-01-03’, prezzo: 1000}

Questa raccolta contiene decine di milioni di documenti.

Voglio chiamare distinto con due chiavi:

collection.distinct('market', 'code'); 

e ottieni risultato:

[{market: ‘SH’, codice: ‘000001’}, {market: ‘SZ’, codice: ‘000001’}, {market: ‘SH’, codice: ‘000002’}]

Come comando distinto nativo accetta solo una chiave, provo a implementarla usando map-reduce. Ma la riduzione della mappa è troppo lenta per distinguere i nativi. Nel mio test distinto a una chiave, la riduzione della mappa spende circa dieci volte di più rispetto a quella nativa.
Esiste un modo efficace per implementare il multikey distinto?

Se si è disposti ad aspettare la prossima versione 2.2 di MongoDB, è ansible eseguire questa query in modo efficiente utilizzando il framework di aggregazione:

 collection = db.tb; result = collection.aggregate( [ {"$group": { "_id": { market: "$market", code: "$code" } } } ] ); printjson(result); 

Su una collezione da un milione di record sulla mia macchina di prova, questo funzionava in 4 secondi, mentre la versione map / reduce richiedeva più di un minuto.