Как суммировать значения данного ключа и группы по другому ключу? PyMongo / MongoDB - PullRequest
0 голосов
/ 30 апреля 2019

Извиняюсь, если вопрос сбивает с толку, я не совсем уверен, как сформулировать вопрос.То, что я пытаюсь сделать, должно быть ясно из примера.

У меня есть приложение, содержащее некоторые данные о музыкальных треках.Пользователи загружают трек, и люди голосуют за него.Вот часть моей коллекции треков:

{
    "_id": {
        "$oid": "5c98e400c0b156250eeda15c"
    },
    "track_title": "I Heard It Through The Grapevine",
    "description": "A nice track description",
    "date_added": "25 March 2019 14:52",
    "artist": "Marvin Gaye",
    "genre": "Soul",
    "upvotes": 10,
    "youtube_link": "https://www.youtube.com/watch?v=hajBdDM2qdg",
    "year": 1968,
    "user_name": "Christine"
}

{
    "_id": {
        "$oid": "5c990754c0b1563bbbc577a2"
    },
    "track_title": "Snow",
    "description": "Foo bar spam eggs",
    "date_added": "25 March 2019 16:36",
    "artist": "Red Hot Chili Peppers",
    "genre": "Alternative Rock",
    "upvotes": 6,
    "youtube_link": "https://www.youtube.com/watch?v=ifXalt3MJtM",
    "year": 2006,
    "date_added_raw": {
        "$date": "2019-03-25T16:36:52.988Z"
    },
    "user_name": "Frazer"
}

{
    "_id": {
        "$oid": "5c938e11c0b15662ec3c79de"
    },
    "track_title": "Californication",
    "description": "I am foo, bar are you?",
    "date_added": "21 March 2019 13:53",
    "artist": "Red Hot Chili Peppers",
    "genre": "Alt Rock",
    "upvotes": 10,
    "youtube_link": "https://www.youtube.com/watch?v=YlUKcNNmywk",
    "year": 2000,
    "user_name": "Ewan M"
}

Я пытаюсь найти исполнителя с наибольшим количеством голосов в коллекции.

В идеалепроцесс будет выглядеть примерно так:

  1. Получить общее количество голосов за каждого исполнителя
  2. Сортировать по возрастанию голосов по убыванию

В случае коллекции примероввыше, я получил бы что-то вроде:

{
    "artist": "Red Hot Chili Peppers",
    "total_upvotes": 16,
}

{
    "artist": "Marvin Gaye",
    "total_upvotes": 10,
}

Затем я мог бы работать с полученной коллекцией, получая не только самого популярного художника, но, возможно, второго и третьего самых популярных.

Пока что я могу суммировать все положительные отзывы по всей коллекции (то есть общее количество голосов, поданных по всем трекам)

# Get the total number of upvotes cast on the app
# First, get a list of all the upvote values
all_upvotes_list = list(tracks_collection.find( { },
                                { 'upvotes': 1, '_id' :0 }
                            ))

# Iterate through the list and sum the values
all_upvotes = sum(item['upvotes'] for item in all_upvotes_list)

Но я не совсем уверен, где его взять, или даже еслиЯ иду в правильном направлении.Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2019

Решил, в конце получилось достаточно просто.

Группировка по артистам, а затем сумма голосов:

db.tracks.aggregate([
                     { '$group': { '_id': "$artist", 'total': { '$sum': '$upvotes' } } },
                     { '$sort': { 'total': -1 } }
                   ])
...