Mongoose/MongoDB 获取一天内查看次数最多的文章

Posted

技术标签:

【中文标题】Mongoose/MongoDB 获取一天内查看次数最多的文章【英文标题】:Mongoose/MongoDB Get mostly viewed articles grouped within a day 【发布时间】:2020-05-10 15:07:27 【问题描述】:

我正在尝试在 Node.js 上使用 MongoDB + Mongoose 克隆类似于 Reddit 的社区板 API。

我的示例 JSON 数据如下所示:

            
                "genre": "free",
                "viewCount": 90,
                "isDeleted": false,
                "commentCount": 0,
                "voteCount": 0,
                "_comments": [],
                "_vote": [],
                "_id": "ObjectId",
                "title": "blahblah",
                "contents": "blah",
                "createdAt": "2020-01-24T08:50:28.409Z",
                "__v": 0,
                "id": "5e2aafd4395bf593aa94b623"
            ,

为了解决这个问题,我简单地使用.sort( viewCount:-1, createdAt: -1 )排序。

但是,当我以这种方式排序时,最近创建的帖子将始终排在第一位,即使其他帖子的 viewCount 值更大...

我想到的下一个事情是尝试按每天对帖子数据进行分组(即今天创建的所有帖子都分组在一起;昨天创建的所有帖子都分组在一起)。

分组后,也许我可以按viewCount 对其余数据进行排序。

我相信使用aggregate 的方法将是一种可能的解决方案,但我想知道对于这个问题是否有最简单和最好的解决方案!

我想得到的输出是这样的:

// viewcount in Descending Order
 '2020-01-24': 
 post1:  viewcount: 999, contents: ..., 
 post2:  viewcount: 998, contents:... , 
...  , 
'2020-01-23':  
 post1:  viewcount: 999, contents: ..., 
 post2:  viewcount: 998, contents:... , 
... , 
'2020-01-22':  
 post1:  viewcount: 999, contents: ..., 
 post2:  viewcount: 998, contents:... , 
... , ...

请帮帮我...

谢谢你:)

【问题讨论】:

是的,使用聚合是一种方法(每天分组发布数据)。请参阅MongoDB docs 中的此示例。 所以如果我想按一天分组并保留原始数据,那么我应该使用 $$Root 吗?? 按天分组并获取 viewCount 的max。你希望输出是什么样子的? 这将为您提供结果:(1)按天排序(asc)和查看次数(desc),以及(2)按天分组并获取第一个($first)文档($$ ROOT)为每个组。然后使用$project 塑造最终输出。 您可以编辑您的帖子并在其中包含输出 【参考方案1】:

此聚合给出的结果与您期望的输出相似:

db.test.aggregate( [ 
   $sort:  createdAt: -1, viewCount: -1 ,
   $group:  _id: "$createdAt", post:  $push: "$$ROOT"   ,
   $project:  post: 1, date: "$_id", _id: 0  
] )

【讨论】:

以上是关于Mongoose/MongoDB 获取一天内查看次数最多的文章的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose / MongoDB:获得倒数第二个文档

你的眼睛一天内经历几万次“失明”,只是为了让你看清世界

SpaceX「十一手」火箭创纪录,一天内两次升空,马斯克:飞100次才退役

Mongoose/Mongodb 数据库调用以不一致的顺序返回数据

一天内到达 Kafka 主题的消息数

将图像文件从 React 前端上传到 Node/Express/Mongoose/MongoDB 后端(不工作)