【问题标题】:Mongodb: Get documents sorted by a dynamic rankingMongodb:获取按动态排名排序的文档
【发布时间】:2017-07-02 15:19:38
【问题描述】:

我有这些文件:

{ "_id" : ObjectId("52abac78f8b13c1e6d05aeed"), "score" : 125494, "updated" : ISODate("2013-12-14T00:55:20.339Z"), "url" : "http://pictwittrer.com/1crfS1t" }
{ "_id" : ObjectId("52abac86f8b13c1e6d05af0f"), "score" : 123166, "updated" : ISODate("2013-12-14T00:55:34.354Z"), "url" : "http://bit.ly/JghJ1N" }

现在,我想按此动态排名对所有文档进行排序:

ranking = score / (NOW - updated).abs

ranking 是一个浮点值,其中: - score 是我的文档的 scopre 属性的值 - 分母只是现在(当我执行此查询时)和我的文档的更新字段之间的区别

我想这样做是因为我希望旧文档最后排序

【问题讨论】:

    标签: mongodb sorting aggregation-framework


    【解决方案1】:

    我是 Mongodb 和聚合框架的新手,但考虑到Tim B 给出的答案,我想出了这个:

    db.coll.aggregate(
          { $project : {
                         "ranking" : { 
                                      "$divide" : ["$score", {"$subtract":[new Date(), "$updated"]}]
                                     }
                       }
          },
          { $sort : {"ranking" : 1}})
    

    使用$project,您可以重塑文档以插入预先计算的值,在您的情况下是排名字段。之后使用$sort,您可以通过指定1 表示升序或-1 表示降序,按照您喜欢的顺序对文档进行排序。

    对于糟糕的代码格式,我深表歉意,我试图使其尽可能可读。

    【讨论】:

    • 太棒了!您还知道如何返回每个文档的所有字段吗?这里只返回“_id”和“ranking”
    • @Nikolay Manolov 你不必告诉包括_id - 它默认包括在内。 (你也应该用"_id": 1代替"_id": "$_id"。)
    • 目前没有办法告诉它返回所有字段+排名,您必须手动列出字段...
    【解决方案2】:

    看看 MongoDB 聚合框架,你可以做一个项目来创建你想要的分数,然后根据创建的分数进行排序。

    http://docs.mongodb.org/manual/core/aggregation-pipeline/

    http://docs.mongodb.org/manual/reference/command/aggregate/#dbcmd.aggregate

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2023-01-03
      • 2013-07-28
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2015-12-23
      • 2019-07-04
      相关资源
      最近更新 更多