MongoDB组和排序类型错误:不是一个函数

时间:2013-09-17 14:36:03

标签: mongodb

我有一些推文集合,我想找到一个用户ID,该用户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()只是看起来它既不是user.id也不是total

2 个答案:

答案 0 :(得分:4)

group函数不支持MongoDB cursor。您应该使用aggregate方法代替记录here

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

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

有关group使用aggregate here的详细信息。

答案 1 :(得分:1)

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

应该注意的是,group函数存在许多缺陷,包括缺乏体面的后处理聚合(正如您尝试使用sort所指出的那样)并且缺少对分片的官方支持。 / p>

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

  

我想通过聚合做更好的事情吗?

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