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

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

{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 тратит примерно в десять раз дольше, чем родной.
Есть ли эффективный способ реализации мультикии?

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

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

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

  • mongoDB / mongoose: уникальный, если не null
  • Операторы MongoDB $ gt / $ lt с ценами, хранящимися как строки
  • Есть ли возможность ограничить использование памяти mongodb?
  • Обновление вложенных массивов в mongodb
  • Производительность MongoDB по агрегационным запросам
  • MongoDB: Как узнать, содержит ли поле массива элемент?
  • Отобразить основной вид HTML?
  • Node.js - Mongoose - проверьте, существует ли коллекция
  • Согласование структуры агрегации mongodb по вложенным документам
  • Запрос размера внутреннего массива в MongoDB
  • MongoDB: уникальный индекс для свойства элемента массива
  • Interesting Posts

    Apple / Mac OS X – существует ли диспетчер пакетов, например Linux

    Почему неравные объемы оперативной памяти в каждом слоте снижают производительность?

    Почему свойство, которое я хочу высмеять, должно быть виртуальным?

    Flac2mp3 на mac?

    Почему арифметическое неопределенное поведение указателя out-of-bounds?

    Как создать плитки с пользовательскими цветами На стартовом экране

    Каковы отличия между Windows 7 Enterprise и Ultimate?

    Возможно ли одновременная загрузка двух ОС одновременно?

    Как преобразовать список, состоящий из вектора разной длины в полезный кадр данных в R?

    Создать таблицу PDF

    «Задолженность недолговечна», похоже, виноват в неправильной

    Невозможно удалить rEFInd на моем macbook pro

    Java: как проверить, находится ли дата в определенном диапазоне?

    Android: статическая переменная null на низкой памяти

    Обеспечение того, чтобы все выполнялось в streamе пользовательского интерфейса в WPF

    Давайте будем гением компьютера.