Mongo 查询怎样先按一个字段分组,然后对所有组进行组内排序(按另一字段)?

2016-12-08 16:28:50 +08:00
 kidlj

比方说数据库存有 Post 类型的数据,每个文档记录了发布帖子的时间和该帖子获得的投票数:

...
{ time: 1481185194698,
  vote: 2 }
...

我这里想执行一个 find({}) 操作,把所有帖子按照发布时间 24 小时间隔分组(新一天的组排前面),然后每个组内再按照投票数排序。我查遍了 MongoDB 的文档,没有找到解决方案,请问这可以办到吗?

3590 次点击
所在节点    MongoDB
10 条回复
kidlj
2016-12-08 16:33:05 +08:00
我也查看了 Mongo 的 aggregate 操作,聚合的 $group 和 $bucket 操作都会合并文档,我这里只想查询,不想合并文档。
wanganjun
2016-12-08 19:31:30 +08:00
用 mapReduce ,分组逻辑自己写
kidlj
2016-12-08 21:29:48 +08:00
@wanganjun 谢谢提供思路,我去试试。
wudanyang
2016-12-08 21:59:03 +08:00
怎么感觉你这个用 sort({time:-1,vote,1}) 就可以做到呢
wudanyang
2016-12-08 21:59:30 +08:00
写错了: sort({time:-1,vote:1})
kidlj
2016-12-08 22:09:59 +08:00
@wudanyang 不行,这样同一天的帖子也会按照时间排序,而我想同一天的帖子按投票数排序。不同天的帖子按天数分组排序。
goophy
2016-12-08 22:17:08 +08:00
查 pipe , project 试试
wudanyang
2016-12-09 10:35:12 +08:00
加个 date 字段
cike
2016-12-09 10:44:45 +08:00
@kidlj “ wanganjun : 用 mapReduce ,分组逻辑自己写”,能实现么?
kidlj
2016-12-09 20:18:22 +08:00
@wanganjun @goophy @wudanyang @cike 感谢各位提供的帮助,我最终采用的解决方案是在数据库新增了一个 daysFrom 字段来保存距离 1970/1/1 的天数,然后按照该天数排序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/326213

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX