将此SQL表示为Mongo Query

时间:2013-02-18 12:09:16

标签: mysql sql mongodb

我想弄清楚我网站上最活跃的用户。

我有

形式的记录
{
    "_id" : "db1855b0-f2f4-44eb-9dbb-81e27780c796",
    "createdAt" : 1360497266621,
    "profile" : { "name" : "test" },
    "services" : { "resume":
        { "loginTokens" : [{
                "token" : "82c01cb8-796a-4765-9366-d07c98c64f4d",
                "when" : 1360497266624
            },
            {
                "token" : "0e4bc0a4-e139-4804-8527-c416fb20f6b1",
                "when" : 1360497474037
            } ]
        },
        "twitter" : {
            "accessToken" : "9314Sj9kKvSyosxTWPY5r57851C2ScZBCe",
            "accessTokenSecret" : "UiDcJfOfjH7g9UiBEOBs",
            "id" : 2933049,
            "screenName" : "testname"
        }
    }
}

我希望能够按loginTokens的数量选择用户和订购。 在MySQL中,它将类似于:

SELECT id, COUNT(logins) AS logins 
FROM users 
GROUP BY id ORDER BY logins DESC

我在querymongo.com上尝试了这个,我收到了一个错误(无法通过非列名称使用别名/ cant顺序)

Mongo的做法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

我刚转换:

SELECT id, COUNT(logins)
FROM users 
GROUP BY id

要:

db.users.group({
    "key": {
        "id": true
    },
    "initial": {
        "countlogins": 0
    },
    "reduce": function(obj, prev) {
        prev.countlogins++;
    }
});

希望这有帮助

答案 1 :(得分:0)

以下是您使用聚合框架所说内容的示例:

db.users.aggregate([
    {$unwind: '$services.resume.loginTokens'},
    {$group: {_id: '$_id', logins: {$sum: 1}}},
    {$sort: {logins: -1}}
])

这应该可以解决问题。