V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
kidlj
V2EX  ›  MongoDB

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

  •  
  •   kidlj · 2016-12-08 16:28:50 +08:00 · 3681 次点击
    这是一个创建于 2905 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    10 条回复    2016-12-09 20:18:22 +08:00
    kidlj
        1
    kidlj  
    OP
       2016-12-08 16:33:05 +08:00
    我也查看了 Mongo 的 aggregate 操作,聚合的 $group 和 $bucket 操作都会合并文档,我这里只想查询,不想合并文档。
    wanganjun
        2
    wanganjun  
       2016-12-08 19:31:30 +08:00 via iPhone   ❤️ 1
    用 mapReduce ,分组逻辑自己写
    kidlj
        3
    kidlj  
    OP
       2016-12-08 21:29:48 +08:00 via Android
    @wanganjun 谢谢提供思路,我去试试。
    wudanyang
        4
    wudanyang  
       2016-12-08 21:59:03 +08:00
    怎么感觉你这个用 sort({time:-1,vote,1}) 就可以做到呢
    wudanyang
        5
    wudanyang  
       2016-12-08 21:59:30 +08:00
    写错了: sort({time:-1,vote:1})
    kidlj
        6
    kidlj  
    OP
       2016-12-08 22:09:59 +08:00 via Android
    @wudanyang 不行,这样同一天的帖子也会按照时间排序,而我想同一天的帖子按投票数排序。不同天的帖子按天数分组排序。
    goophy
        7
    goophy  
       2016-12-08 22:17:08 +08:00 via iPhone
    查 pipe , project 试试
    wudanyang
        8
    wudanyang  
       2016-12-09 10:35:12 +08:00
    加个 date 字段
    cike
        9
    cike  
       2016-12-09 10:44:45 +08:00
    @kidlj “ wanganjun : 用 mapReduce ,分组逻辑自己写”,能实现么?
    kidlj
        10
    kidlj  
    OP
       2016-12-09 20:18:22 +08:00
    @wanganjun @goophy @wudanyang @cike 感谢各位提供的帮助,我最终采用的解决方案是在数据库新增了一个 daysFrom 字段来保存距离 1970/1/1 的天数,然后按照该天数排序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2865 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.