如何对给定键的值求和并按不同的键分组? Pymongo / Mongodb

时间:2019-04-30 13:58:21

标签: python mongodb mongodb-query pymongo

很抱歉,如果这个问题令人困惑,我不完全确定该如何措辞。希望从示例中可以明显看出我正在尝试做的事情。

我有一个应用,其中包含有关音乐曲目的一些数据。用户上传曲目,人们对此进行投票。这是我的曲目集合的一部分:

np.nan

我要做的是在整个收藏集中找到最具投票力的艺术家

理想情况下,该过程类似于:

  1. 获取每位艺术家的总票数
  2. 按降序排列

在上面的示例集合中,我会得到类似的东西:

{
    "_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"
}

然后我可以处理生成的作品集,不仅获得最受欢迎的艺术家,而且也可能获得第二和第三名。

到目前为止,我已经能够汇总集合中的所有投票(即,所有曲目的总票数)

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

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

但是我不确定从哪里拿走它,即使我朝着正确的方向前进。有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

解决了这个问题,最后很容易。

按艺术家分组,然后汇总票数:

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