【问题标题】:How to sort two fields with mongoose?如何用猫鼬对两个字段进行排序?
【发布时间】:2016-05-03 19:41:50
【问题描述】:

我试图让用户看到热门帖子。一般的想法是按最近的帖子排序(_id:-1),然后按最多的投票(upvotes_count:-1)排序,然后限制结果(.limit(3))。这有点简化,所以请忽略这种“热门帖子”的实现。

不幸的是,我无法以我想要的方式返回两种。因此,对于六个帖子的集合,它会返回最近的三个帖子,但不会按最多的投票对它们进行排序。例如:

发布 6(点赞:1) 帖子 5(点赞数:2) 发布 4(点赞:1)

我希望它们像这样排序:

发布 5(点赞数:2) 帖子 6(点赞数:1) 发布 4(点赞:1)

我对平局的结果不太感兴趣,但至少,我希望获得更多支持的帖子比支持更少的帖子排名更高。

当然,我可以编写一种方法来对它们进行排序,但肯定有一种方法可以使用 MongoDB 来做到这一点。

以下是我尝试实现这种排序的一些方法。

// Use sort for date and then use it again for upvotes_count
Post.find()
    .sort({_id: -1})
    .sort({upvotes_count: -1})
    .limit(3)
    .exec( function(err, posts) {
        if (err) res.send(err);
        console.log(posts);
        res.json(posts);
     });

// Use sort for date, limit the results to three, and then
// use it again for upvotes_count
Post.find()
    .sort({_id: -1})
    .limit(3)
    .sort({upvotes_count: -1})
    .exec( function(err, posts) {
        if (err) res.send(err)
        console.log(posts);
        res.json(posts);
    });

// Use sort for date and upvotes_count in one step.
Post.find()
    .sort({_id: -1, upvotes_count: -1})
    .limit(3)
    .exec( function(err, posts) {
        if (err) res.send(err);
        console.log(posts);
        res.json(posts);
     });

没有一个有效。

【问题讨论】:

    标签: node.js mongodb sorting mean database


    【解决方案1】:

    参考sort() 定义。

    sort({_id: -1, upvotes_count: -1})

    表示首先对_id 进行排序,然后仅对那些相同 _id 的帖子按降序对upvotes_count 进行排序。不幸的是,_idObjectId,它是 12 字节 BSON 类型,使用以下构造:

    • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
    • 一个 3 字节的机器标识符,
    • 一个 2 字节的进程 ID,以及
    • 一个 3 字节的计数器,从一个随机值开始。

    很难得到相同的ObjectId。即每条记录的_id在本文档中应该是唯一的。因此,您的测试代码的结果只是按_id desc 排序。

    这是一个例子,

    +---------+---------------+
    | _id     |  upvote_count |
    +---------+---------------+
    |  1      |      5        |
    |  4      |      7        |
    |  3      |      9        |
    |  4      |      8        |
    

    sort({_id: -1, upvotes_count: -1}) 的结果应该是

    +---------+---------------+
    | _id     |  upvote_count |
    +---------+---------------+
    |  4      |      8        |
    |  4      |      7        |
    |  3      |      9        |
    |  1      |      5        |
    

    upvote_count 将被排序为相同的_id

    但是,在这种情况下。在这种情况下有相同的_id

    +---------+---------------+
    | _id     |  upvote_count |
    +---------+---------------+
    |  1      |      5        |
    |  4      |      7        |
    |  3      |      9        |
    |  2      |      8        |
    

    sort({_id: -1, upvotes_count: -1}) 的结果应该是

    +---------+---------------+
    | _id     |  upvote_count |
    +---------+---------------+
    |  1      |      5        |
    |  2      |      8        |
    |  3      |      9        |
    |  4      |      7        |
    

    【讨论】:

    • sort({_id: -1}) 按最近的顺序排列项目。因此,一旦有了该列表,我就不明白为什么它不能按 upvotes_count 对它们进行排序。
    • @JonRoby, upvote_count 只能对相同的_id 进行排序,但是,所有文档中没有相同的_id,因此无法对upvote_count 进行排序...
    【解决方案2】:

    您可以在特定时间找到最高票​​数的文件

    过去 24 小时内投票最多的人

    var yesterday = Date.now()- 1000*60*60*24;
    
    // assuming created_at contains time-stamp
    find({created_at:{$gt:yesterday}}).sort({upvotes_count: -1}).limit(3)
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2013-10-26
      • 1970-01-01
      • 2020-12-18
      • 2019-10-30
      • 2019-06-19
      • 2011-06-12
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多