我有一些推文集合,我想找到一个用户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
。
答案 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中进行排序。
我想通过聚合做更好的事情吗?
在上面的回答之后,我的结论是:是的。