javascript - Mongo 查询怎样先按一个字段分组,然后对所有组进行组内排序(按另一字段)?
本文介绍了javascript - Mongo 查询怎样先按一个字段分组,然后对所有组进行组内排序(按另一字段)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
比方说数据库存有 Post 类型的数据,每个文档记录了发布帖子的时间和该帖子获得的投票数:
...
{ time: 1481185194698,
vote: 2 }
...
我这里想执行一个 find({}) 操作,把所有帖子按照发布时间 24 小时间隔分组(新一天的组排前面),然后每个组内再按照投票数排序。我查遍了 MongoDB 的文档,没有找到解决方案,请问这可以办到吗?
我也查看了 Mongo 的 aggregate 操作,聚合的 $group 和 $bucket 操作都会合并文档,我这里只想查询,不想合并文档。
------------------------UPDATE 2016/12/09--------------------------
问题解决了,最终采用的解决方案是在数据库里新增一个 daysFrom 字段,用来保存距离 1970/1/1 过去的天数,然后按照该天数排序。
解决方案
办法还是有的,会比较绕一些。
首先你的时间是NumberLong
,这种类型无法直接取到天。所以第一步需要转换类型,把所有记录的天拿出来投影成一个字段。
然后没理解错的话,你的要求应该是按天排序,同样的天内再按vote
排序。所以第二个pipeline是一个$sort
。处理之后应该是你想要的结果。
db.test.aggregate([
// {$match: <cond>}
{
$project: {
time: "$time",
date: {$multiply: [{$floor: {$divide: ["$time", 86400000]}}, 86400000]}, // 864000ms = 1天
vote: "$vote"
}
},
{$sort: {date: 1, vote: -1}}
])
注意:
如果对全部数据都做这个操作,肯定是一个很费时的操作,所以建议第一个条件用
$match
先过滤出你感兴趣的时间再进行后面的操作如果考虑到时区问题,可能还要做些修改。不妨自己理解一下上面的语句再自己修改。
这篇关于javascript - Mongo 查询怎样先按一个字段分组,然后对所有组进行组内排序(按另一字段)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文