Как эффективно выполнять "отличные" с несколькими ключами?
Например, существует такая коллекция:
{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 секунды, в то время как версия карты/сокращения заняла более минуты.