用Spring MongoTemplate实现根据时间倒序查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Spring MongoTemplate实现根据时间倒序查询相关的知识,希望对你有一定的参考价值。

mysql可以这么写SELECT * FROM tablename ORDER BY create_time DESC LIMIT 5
但是用MongoTemplate只能写到这里 ,不知道怎么倒序
Query query = Query.query(Criteria.where("sysName").is(Constant.SYS_TYPE_PORTAL).and("userName").is(account)).limit(5);
求知道的朋友指点一下.

参考技术A query.with(new Sort(Direction.DESC, "create_time "));本回答被提问者采纳 参考技术B query.with(new Sort(new Sort.Order(Sort.Direction.DESC,"create_time")));

Mongotemplate聚合java spring GroupBy

【中文标题】Mongotemplate聚合java spring GroupBy【英文标题】:Mongo Template Aggregtion java spring GroupBy 【发布时间】:2020-09-28 10:10:59 【问题描述】:
db.billingDomain.aggregate([
  
    $group: 
      _id: 
        day:  $dayOfMonth: "$createdAt" ,
        month:  $month: "$createdAt" ,
        year:  $year: "$createdAt" 
      ,
      count: 
        $sum: 1
      ,
      date: 
        $first: "$createdAt"
      
    
  ,
  
    $project: 
      date: 
        $dateToString: 
          format: "%Y-%m-%d",
          date: "$date"
        
      ,
      count: 1,
      _id: 0
    
  ,
  
    $match: 
      "date": 
        $gte: "2020-06-05"
      
    
  
])

如何在 Spring Java 中使用 mongo Template、Aggregation 构建此查询?进行此查询时面临挑战

【问题讨论】:

【参考方案1】:

Spring Mongo 并不支持所有的 MongoDB 语法,所以我们需要手动实现AggregationOperation(Java >=v1.8):

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.query.Criteria.*;
import static org.springframework.data.mongodb.core.aggregation.DateOperators.*;


Aggregation agg = newAggregation(
    op -> new Document("$group",
        new Document("_id",
            new Document("day", new Document("$dayOfMonth", "$createdAt"))
                .append( "month", new Document("$month", "$createdAt"))
                .append( "year", new Document("$year", "$createdAt")))
        .append("count", new Document("$sum", 1))
        .append("date", new Document("$first", "$createdAt"))),
    project("count")
        .andExclude("_id")
        .and(dateOf("date").toString("%Y-%m-%d")).as("date"),
    match(where("date").gte("2020-06-05")));

AggregationResults<OutputClass> result = mongoTemplate.aggregate(agg,
    mongoTemplate.getCollectionName(BillingDomain.class), OutputClass.class);

编辑: System.out.println(agg);


   "aggregate":"__collection__",
   "pipeline":[
      
         "$group":
            "_id":
               "day":
                  "$dayOfMonth":"$createdAt"
               ,
               "month":
                  "$month":"$createdAt"
               ,
               "year":
                  "$year":"$createdAt"
               
            ,
            "count":
               "$sum":1
            ,
            "date":
               "$first":"$createdAt"
            
         
      ,
      
         "$project":
            "count":1,
            "_id":0,
            "date":
               "$dateToString":
                  "format":"%Y-%m-%d",
                  "date":"$date"
               
            
         
      ,
      
         "$match":
            "date":
               "$gte":"2020-06-05"
            
         
      
   ]

【讨论】:

项目方法在此方法中不可用 @ParminderSingh 你是什么意思? project("count")... @ParminderSingh 不清楚您的项目有什么问题?不行吗?

以上是关于用Spring MongoTemplate实现根据时间倒序查询的主要内容,如果未能解决你的问题,请参考以下文章

关于Spring中MongoTemplate.aggregate的一个奇异bug

SpringBoot系列之MongoTemplate加PageHelper分页实现

利用MongoTemplate 简单实现MongoDB 增删改查

利用MongoTemplate 简单实现MongoDB 增删改查

利用MongoTemplate 简单实现MongoDB 增删改查

带有 MongoTemplate 的 Spring Boot