Как эффективно выполнять "отличные" с несколькими ключами?

Например, существует такая коллекция:

{market: 'SH', код: '000001', дата: '2012-01-01', цена: 1000}
{market: 'SZ', код: '000001', дата: '2012-01-01', цена: 1000}
{market: 'SH', код: '000001', дата: '2012-01-02', цена: 1000}
{market: 'SZ', код: '000001', дата: '2012-01-02', цена: 1000}
{market: 'SH', код: '000002', дата: '2012-01-03', цена: 1000}
...

Эта коллекция содержит десятки миллионов документов.

Я хочу назвать разным два ключа:

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

и получить результат:

[{market: 'SH', код: '000001'}, {market: 'SZ', код: '000001'}, {market: 'SH', код: '000002'}]

Поскольку встроенная отдельная команда принимает только один ключ, я пытаюсь реализовать ее, используя map-reduce. Но map-reduce слишком медленный, чтобы явные отличия. В моем однократном отдельном тесте, map-reduce тратит примерно в десять раз дольше, чем родной.
Есть ли эффективный способ реализации мультикии?

Ответ 1

Если вы готовы подождать предстоящего выпуска версии MongoDB 2.2, вы можете эффективно выполнять этот запрос с использованием структуры агрегации:

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

На миллионной коллекции на моей тестовой машине это заработало через 4 секунды, в то время как версия карты/сокращения заняла более минуты.