Mongodb:获取按动态排名排序的文档

时间:2013-12-14 01:00:31

标签: mongodb sorting aggregation-framework

我有这些文件:

{ "_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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

对于可怕的代码格式化,我很抱歉,我尽量让它变得可读。

答案 1 :(得分:0)

查看MongoDB聚合框架,您可以创建一个项目来创建所需的分数,然后进行排序以按创建的分数进行排序。

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

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