mongodb为用户提供最喜欢的帖子

时间:2014-02-11 18:28:18

标签: node.js mongodb express

如果我的文档集合看起来或多或少像这样:

{
"_id": "52c06c86b78a091f26000001",
"desc": "Something somethingson",
"likes": [
    {
        "user_id": "52add4f4344e8ca867000001",
        "username": "asd",
        "created": 1390652212592
    },
    {
        "user_id": "52add4f4344e8ca867000001",
        "username": "asd",
        "created": 1390652212592
    }
],
"user_id": "52add4f4344e8ca867000001",
"username":"username"
}

我可以使用mongodb(使用nodejs& express)获取10个用户最喜欢的帖子列表吗?

我认为应该可以通过“user_id”对所有帖子进行分组,然后计算“likes”数组中的项目总数来实现Map-Reduce或Aggregate。然后从那里获得前10名“user_id”。

我猜这是可能的。唯一的问题是我没有从mongo网站获得足够的例子来组合我自己的东西。

有人能告诉我这样做的一个例子,或者至少告诉我它是不可能的。 =)

3 个答案:

答案 0 :(得分:4)

尝试一下......

db.collection.aggregate([
  {$unwind: "$likes"},
  {$group: {_id: "$user_id", likesCount: {$sum: 1}}},
  {$sort: {likesCount: -1}},
  {$limit: 10},
  {$project: {_id: 1}}
])

请参阅此tutorial

答案 1 :(得分:2)

,有可能:

db.coll.aggregate([
    {
        $unwind: "$likes"
    },
    {
        $group: {
            _id: "$user_id", 
            likesPerUser: {
                $sum:1
            }
        }
    }
    {
        $sort: {
            likesPerUser: -1
        };
    }
    {
        $limit: 10
    }
])

答案 2 :(得分:0)

如果您需要计算每位父用户的喜欢元素数量,您可以执行以下操作:

http://mongotry.herokuapp.com/#?bookmarkId=52fb8c604e86f9020071ed71

[
{
    "$unwind": "$likes"
},
{
    "$group": {
        "_id": "$user_id",
        "likesPerUser": {
            "$sum": 1
        }
    }
},
{
    "$sort": {
        "likesPerUser": -1
    }
},
{
    "$limit": 10
}
]

否则,如果您需要相同的用户ID数量,每个子文档计数1遍及所有父母,您可以执行以下操作:

http://mongotry.herokuapp.com/#?bookmarkId=52fb8cf74e86f9020071ed72

[
{
    "$unwind": "$likes"
},
{
    "$group": {
        "_id": "$likes.user_id",
        "likesPerUser": {
            "$sum": 1
        }
    }
},
{
    "$sort": {
        "likesPerUser": -1
    }
},
{
    "$limit": 1
}
]