MongoDB根据Document中List类型的Field分页查询

后端 潘老师 5个月前 (12-08) 106 ℃ (0) 扫码查看

本文主要讲解关于MongoDB根据Document中List类型的Field分页查询相关内容,让我们来一起学习下吧!

一、需求场景

就是个列表展示的分页查询,只不过数据是存在MongoDB中的,存的格式如下:

{
  "modifyUser": "test",
  "createUser": "test",
  "action":"SKIP"
  "detail": [
    "1234",
    "5938",
    "6189",
    "6549",
    "7932",
    "7933",
    // 此处省略若干条
    .......
  ]
},
{
  "modifyUser": "test",
  "createUser": "test",
  "action":"INCLUDE"
  "detail": [
    "7696",
    "0986",
    "7654",
    "0985",
    "3457",
    "0985",
    // 此处省略若干条
    .......
  ]
}

前台页面要求如下展示:

这意味着要根据数据库中每一条数据的detail字段进行分页查询。

二、实现方案

话不多说,直接看最终的实现方案:

public List<DO> pageQuery(Request request){
    
    // 根据自己的入参构造查询条件
    Criteria criteria = buildCriteria(request);

    Aggregation aggregation = Aggregation.newAggregation(
            match(criteria),
            unwind("detail", true),
            sort(Sort.Direction.ASC, "detail"),
            skip((queryRequest.getPageIndex().longValue() - 1) * queryRequest.getPageSize()),
            limit(queryRequest.getPageSize())
    );

    return mongoTemplate.aggregate(aggregation, "table", DO.class).getMappedResults();
}

三、涨点知识

aggregate()是MongoDB的聚合函数,Aggregation是与之对应的聚合框架,主要用于对多个document的数据进行各种聚合计算,以返回最终需要的结果。

以上面的数据和实现方案为例,看看每一步都做了些什么?

 Aggregation aggregation = Aggregation.newAggregation(
        match(criteria),
        unwind("detail", true),
        sort(Sort.Direction.ASC, "detail"),
        skip((queryRequest.getPageIndex().longValue() - 1) * queryRequest.getPageSize()),
        limit(queryRequest.getPageSize())
);

将上述代码转换为MongoDB的SQL:

db.test_table.aggregate(
    [
        { $match : {action:"SKIP"} },
        { $unwind: {path: "$detail",preserveNullAndEmptyArrays: true} },
        { $sort: {"detail"} },
        { $skip: 0 },
        { $limit: 10 },
    ] );

主要看一下前两步做了什么:

$match匹配过滤条件,将符合条件的文档筛选出来,$unwind将筛选后的结果中的detail进行拆分,每一条包含一个数组中的值。再经过排序,限制输出条数等操作,得到我们想要的结果。

MongoDB中常用的聚合操作:

操作 说明 与SQL对照
$match 过滤数据,筛选出符合条件的文档 WHERE
$project 修改输入文档的结构。可以用来重命名、增加或删除field SELECT
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
$limit 用来限制MongoDB聚合管道返回的文档数 LIMIT
$skip 在聚合管道中跳过指定数量的文档
$group 将集合中的文档分组 GROUP BY
$sort 将输入文档排序后输出 ORDER BY
$lookup 连表查询,将被关联集合添加到执行操作的集合中 JOIN

以上就是关于MongoDB根据Document中List类型的Field分页查询相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/12273.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】