文章524
标签277
分类67

使用MongoDB查找最近阅读最多的文章

最近给博客的文章添加了一些数据记录,然后用这些在MongoDB中的阅读记录添加了最近阅读比较多的功能;


使用MongoDB查找最近阅读最多的文章

查找阅读比较多的功能主要是通过MongoDB的aggregate操作完成的;

在MondoDB中存储的文档大概是这个样子的:

1
2
3
4
5
6
7
8
{
"docName" : "Java集合七-List总结(LinkedList, ArrayList使用场景及性能分析)",
"insertTime" : ISODate("2020-12-16T09:34:17.286Z")
}
{
"docName" : "关于Mybatis-plus调用baseMapper报错Invalid-bound-statement的解决",
"insertTime" : ISODate("2020-12-16T09:36:44.592Z")
}

现在需要取出insertTime所在的最近几天的数据,并聚合个数;

对应的js代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
async function getLikeAggregate(startTime, endTime) {
const client = new MongoClient(uri, { useNewUrlParser: true });
await client.connect();

const cmd = client.db('db_name').collection('colloection_name');

cmd.aggregate([
{
$group: {
"_id": "$group_name",
"count": { $sum: 1 },
}
},
{ $sort: { count: -1 } },
{ $limit: 5 }
]).toArray(function (err, result) {
for (let r in result) {
console.log("type:" + result[r]._id + "+的数量+" + result[r].count);
}
});
}

上述代码中:

  • group._id:聚合的字段名为group_name;
  • group.count:$sum: 1,表示对count求和;
  • sort:按照count从大到小排序;
  • limit:取出前五个;

调用代码如下:

1
2
3
4
5
6
7
async function test() {
let now = new Date();
let res = await getLikeAggregate(new Date(now.getTime() - 1000 * 60 * 60 * 24), now)
console.log(res);
}

test();

其中1000 * 60 * 60 * 24表示了最近24小时内的内容排序;

最终优化代码后,输出结果如下:

1
2
3
4
5
6
7
[
{ name: '张小凯と彼のBlog', view_count: 32 },
{ name: 'Aria2安装与配置', view_count: 31 },
{ name: '使用Docker部署Redis集群-三主三从', view_count: 20 },
{ name: '使用Docker部署kafka集群', view_count: 20 },
{ name: '分享几个直播源地址', view_count: 15 }
]


本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/cn/2020/12/19/%E4%BD%BF%E7%94%A8MongoDB%E6%9F%A5%E6%89%BE%E6%9C%80%E8%BF%91%E9%98%85%E8%AF%BB%E6%9C%80%E5%A4%9A%E7%9A%84%E6%96%87%E7%AB%A0/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可