0

我有一个推文集合,我想找到一个在集合中发推文最多的用户 ID。所以我group首先要做的是sort

db.tweets.group( { key: {"user.id": 1}, reduce: function (curr, result) { result.total += 1; }, initial: {total: 0} }).sort({total: -1})

但是,mongo shell 抱怨说:

TypeError: db.tweets.group({key:{'user.id':1}, reduce:function (curr, result) {result.total += 1;}, initial:{total:0}}).sort({total:-1}) is not a function (shell):1

我引用了mongodb doc,我认为我的语法sort应该是正确的?另外, 和 有什么区别aggregate?我想做的事情会更好地完成aggregate吗?

我在这里有点困惑,因为没有sort,该命令db.tweets.group( { key: {"user.id": 1}, reduce: function (curr, result) { result.total += 1; }, initial: {total: 0} })给了我这样的东西:{ "user.id" : 1477500938, "total" : 1 }

这看起来是正确的,这也是可运行的:db.tweets.group( { key: {"user.id": 1}, reduce: function (curr, result) { result.total += 1; }, initial: {total: 0} }).sort()只是它似乎既不是 sort by user.idor total

4

2 回答 2

5

group函数不支持 MongoDB cursor。您应该使用此处aggregate记录的方法。

应该是这样的(未经测试):

db.tweets.aggregate(
    { $group : {
        _id : "$user.id",
        total : { $sum : 1 }
    }}
).sort({total: -1});

有关在此处group使用的更多详细信息。aggregate

于 2013-09-17T15:00:50.697 回答
1

group函数实际上返回一个数组。

应该注意的是,该group功能有许多缺陷,包括缺乏体面的后处理聚合(正如您尝试使用 所指出的那样sort)以及缺乏对分片的官方支持。

因此,正如@Pierre 所说,您应该使用聚合框架,但这并不是您真正的问题。你在问为什么一个空的sort()作品。它之所以有效,是因为它是 JavaScript ( http://www.w3schools.com/jsref/jsref_sort.asp )中数组处理的有效函数,因此它实际上是有效的,只是不是以您使用它的方式。它实际上也不像你想象的那样工作,它在 JavaScript 本身而不是在 MongoDB 中排序。

我想做的更好的事情是通过聚合来完成的吗?

在上面的答案之后,我的结论是:是的。

于 2013-09-17T15:10:48.950 回答