2013-08-29 4 views
2

У меня есть куча данных репозитория, которые я выписал из Github. У каждого репозитория есть ключ language, и с pymongo я могу перечислить все языки в моей базе данных с помощью db.distinct('language'). Я хотел бы отсортировать список по количеству вхождений, так что первым языком является мой список, это язык, связанный с большинством репозиториев. Возможно ли это сделать в одном запросе вместо запроса базы данных для подсчета каждого языка?MongoDB: Сортировка отдельных ключей по количеству событий

+0

См http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate – JohnnyHK

ответ

1

Одним из возможных решений является простая карта/сокращение. Преимущество состоит в том, что вы можете использовать его для агрегирования дополнительной информации, такой как количество коммитов, коммиттеров, файлов ...

Возможно, это слишком тяжелое решение для того, что вы хотите. Я не совсем знаком с современной структурой агрегации, но считаю, что если есть решение, отличное от map/reduce, вот где вы, скорее всего, его найдете.

3

Благодаря Николасу Ринаудо и Джонни ХК, я смог выяснить это решение. Идея состоит в том, чтобы группировать каждый репозиторий на основе языка и суммировать количество документов. Затем группы могут быть отсортированы по новому ключу.

db_languages = db.aggregate([ 
    {"$group": { 
     "_id": { 
      "language": "$language", 
     }, 
     "num_repos": { 
      "$sum": 1, 
     } 
    }}, 
    {"$sort": {"num_repos": -1}} 
]) 
Смежные вопросы