mongo分页查询时,使用聚合查询会比条数和数据分开查询更方便.
使用$facet可以事半功倍.
$facet的用法允许您创建多方面的聚合,这些聚合可表征单个聚合阶段中多个维度或方面的数据。多方面的聚合提供了多种过滤器和分类,以指导数据浏览和分析。
以下是示例

{
    "_id" : ObjectId("604b653fc20635d128c5c09d"),
    "deleted" : true,
    "userId" : 1,
    "userName" : "哈哈哈"
}
{
    "_id" : ObjectId("604b655cc20635d128c5c0a5"),
    "deleted" : false,
    "userId" : 2,
    "userName" : "呵呵呵"
}
{
    "_id" : ObjectId("604b656ec20635d128c5c0ab"),
    "deleted" : false,
    "userId" : 3,
    "userName" : "周杰伦"
}
{
    "_id" : ObjectId("604b659ec20635d128c5c0b9"),
    "deleted" : false,
    "userId" : 4,
    "userName" : "周润发"
}
...

匹配条件并进行分页查询

db.getCollection('user').aggregate([
    {"$match":{"deleted":{"$ne":true}}},
    {
      "$facet":{
          "total":[
              {"$count":"total"}
               ],
          "data":[
            {"$skip":0},
            {"$limit":2}
           ] 
          }     
        }
])

查询结果:

{
    "total" : [ 
        {
            "total" : 3
        }
    ],
    "data" : [ 
        {
            "_id" : ObjectId("604b655cc20635d128c5c0a5"),
            "deleted" : false,
            "userId" : 2,
            "userName" : "呵呵呵"
        }, 
        {
            "_id" : ObjectId("604b656ec20635d128c5c0ab"),
            "deleted" : false,
            "userId" : 3,
            "userName" : "周杰伦"
        }
    ]
}

这样就实现了一次查询返回结果和总数.
整合springboot后,使用mongotemplate进行查询,代码如下:

Aggregation deleted = Aggregation.newAggregation(
                match(Criteria.where("deleted").ne(true)),
                Aggregation.facet(count().as("total")).as("count")
                        .and(skip(0L),limit(2L)).as("data")
        );
        AggregationResults<HashMap> user = mongoTemplate.aggregate(deleted, "user", HashMap.class);
         System.out.println(user.getMappedResults());
        
[{data=[{_id=604b655cc20635d128c5c0a5, deleted=false, userId=2, userName=呵呵呵}, {_id=604b656ec20635d128c5c0ab, deleted=false, userId=3, userName=周杰伦}], count=[{total=3}]}]
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐