MongoDB获取文档年龄(以小时为单位)

3
我在想是否有一种方法可以获得MongoDB文档的小时数?这是我目前的代码,但很明显我使用的是一个日期对象,它并没有计算小时数,也没有给出年龄,只是创建日期而已,因此它没有给出期望的结果。实际上,$divide流水线甚至不允许使用日期对象。任何帮助都将不胜感激。顺便说一下,$views变量是NumberInt32类型,$created_at变量是时间戳,例如:2014-05-20T00:01:08.629Z。
db.projects.aggregate({ 
    $project: { 
        "result": {
            $divide: ['$views', '$created_at']
        }
    }
)

如果你想知道,这段代码是用来帮助排序热门帖子的,但当然,这只是其中的一部分。感谢任何帮助!


为什么您不能将创建日期作为查询的一部分呢?例如,匹配所有在现在减去两个小时内创建的文档。 - WiredPrairie
1个回答

2

假设您的文档中包含以下字段:$views$created_at,分别表示浏览次数和创建时间戳:

{
    "_id" : ObjectId("537abe5e8da9877dbb0ef604"),
    "views" : 5,
    "created_at" : ISODate("2014-05-20T00:00:00Z")
}

然后只需要进行一些日期计算,从当前时间获取差异即可:
db.projects.aggregate([
    { "$project": { 
        "score": { "$divide": [
            { "$divide": [
                { "$subtract": [ 
                    new Date(), 
                    "$created_at" 
                ]},
                100*60*60
            ]},
            "$views"
        ]},
        "created_at": 1,
        "views": 1
    }}
])

所以,基本上您正在获得从当前时间到created_at值的时间差作为日期对象。将其除以一天中的标准小时数,然后除以您的views,以获取用于排序的“分数”结果。

当您对两个日期对象进行数学运算时,结果将作为数字返回。因此,之后使用数字进行进一步操作将起作用。


你太棒了,伙计!我明天会测试这段代码并回复你。 - Noah
1
非常好,伙计!在views值增加时得分变小的问题已经解决了,只需将$views值除以年龄即可,而不是反过来。 - Noah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接