Как эффективно выполнять «отличные» с несколькими ключами?
Например, существует такая коллекция:
{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}
…
Эта коллекция содержит десятки миллионов документов.
- Групповая агрегация Mongodb $ group, ограничить длину массива
- mongodb найти несколько элементов массива
- (MongoDB Java) $ push в массив
- MongoDB и «объединяется»
- Несколько условий соединения с помощью оператора $ lookup
Я хочу назвать разным два ключа:
collection.distinct('market', 'code');
и получить результат:
[{market: ‘SH’, код: ‘000001’}, {market: ‘SZ’, код: ‘000001’}, {market: ‘SH’, код: ‘000002’}]
Поскольку встроенная отдельная команда принимает только один ключ, я пытаюсь реализовать ее, используя map-reduce. Но map-reduce слишком медленный, чтобы явные отличия. В моем однократном отдельном тесте, map-reduce тратит примерно в десять раз дольше, чем родной.
Есть ли эффективный способ реализации мультикии?
- Как моделировать систему голосования «любит» с помощью MongoDB
- Запрос массива массивов в MongoDB
- Сервер MongoDB по-прежнему доступен без учетных данных
- MongoDB: вспомогательный субподряд
- как освободить кеширование, которое используется Mongodb?
- Соответствие ObjectId для String для $ graphLookup
- Узел MongoDB проверяет, действительно ли objectid
- Удалить все в базе данных MongoDB
Если вы готовы подождать предстоящего выпуска версии MongoDB 2.2, вы можете эффективно выполнять этот запрос с использованием структуры агрегации:
collection = db.tb; result = collection.aggregate( [ {"$group": { "_id": { market: "$market", code: "$code" } } } ] ); printjson(result);
На миллионной коллекции на моей тестовой машине это заработало через 4 секунды, в то время как версия карты / сокращения заняла более минуты.