【问题标题】:Spring MongoDB query sortingSpring MongoDB 查询排序
【发布时间】:2013-09-02 11:32:34
【问题描述】:

我是 mongodb 的新手,虽然我正在尝试进行有序的 mongodb 查询。但是 spring data mongodb 的 sort 方法已被弃用。所以我用org.springframework.data.domain.Sort

Query query = new Query();
query.with(new Sort(Sort.Direction.ASC,"pdate"));
return mongoTemplate.find(query, Product.class);

我使用了这个代码块。但它没有对数据进行排序。那么,您能更喜欢使用任何有用的方法来进行这种练习吗?

【问题讨论】:

  • 您的代码看起来是正确的,您能否详细说明您是如何得出结论“它没有对数据进行排序”
  • 它们没有在页面上按日期升序排列

标签: java spring mongodb sorting


【解决方案1】:

您可以通过这种方式定义您的排序以忽略大小写:

new Sort(new Order(Direction.ASC, FIELD_NAME).ignoreCase()

【讨论】:

  • 谢谢,我多年前的回答就是这个意思,我接受你的回答。
  • 您实际上可以将逗号分隔的列表(或预先构造的列表)传递给排序构造函数并定义多个排序条件!
  • 它对我不起作用,使用最新的 MongoDb,奇怪...我对 Mongo 和类似的代码有异常... java.lang.IllegalArgumentException: Given sort contains a Order for忽略大小写的用户名! MongoDB目前不支持忽略大小写排序!
  • 现在已弃用。改用 Sort.by(Sort.Direction.ASC, FIELD_NAME))
【解决方案2】:

新答案 - Spring Data Moore

使用Sort.by

Query().addCriteria(Criteria.where("field").`is`(value)).with(Sort.by(Sort.Direction.DESC, "sortField"))

【讨论】:

    【解决方案3】:

    s当您在存储库中编写自定义查询时,您可以在调用期间执行排序。喜欢,

    存储库

    @Query("{ 'id' : ?0}")
    List<Student> findStudent(String id, Sort sort);
    

    调用期间

    Sort sort = new Sort(Sort.Direction.ASC, "date")
    List<Student> students = studentRepo.findStudent(1, sort);  
    

    我希望这会有所帮助! :)

    【讨论】:

      【解决方案4】:
      query.with(new Sort(Sort.Direction.ASC, "timestamp"));
      

      将排序参数记住为字段,1或-1分别指定升序或降序。

      【讨论】:

      • 我们可以使用 query.with() 对多个字段进行排序吗?例如 query.with(new Sort(Sort.Direction.ASC, "timestamp")).with(new Sort(Sort.Direction.DESC,"name"));
      【解决方案5】:

      您可以使用聚合对数据进行排序。您必须使用匹配和分组条件进行聚合查询并展开您的字段。

      AggregationOperation match = Aggregation.match(matching criteria);
      AggregationOperation group = Aggregation.group("fieldname");
      AggregationOperation sort = Aggregation.sort(Sort.Direction.ASC, "fieldname");
      Aggregation aggregation = Aggregation.newAggregation(Aggregation.unwind("fieldname"),match,group,sort);
      

      【讨论】:

        【解决方案6】:

        这是按降序对字段值进行排序的方式。 我的字段值是“nominationTimestamp”,但对你来说它可能是“firstName”。

        List<Movie> result = myMovieRepository.findAll(Sort.by(Sort.Direction.DESC, "nominationTimestamp")); 
        

        myMovieRepository 是扩展 MongoRepository 的任何类的实例。

        【讨论】:

        • 请提供代码解释。没有任何解释的代码将被删除。
        【解决方案7】:

        这个对我有用:

        query.with(Sort.by(Sort.Order.asc("pdate")));
        

        【讨论】:

          【解决方案8】:

          我在 spring 数据中使用 TypedAggregation 和 mongoTemplate 来对结果集进行排序和限制。

          import static org.springframework.data.mongodb.core.aggregation.Aggregation.limit;
          import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
          import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
          import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
          import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
          import org.springframework.data.domain.Sort.Direction;
          
          TypedAggregation<ObjectType> agg = newAggregation(ObjectType.class,
              match(matching Criteria),
              project("_id", ...),
              sort(Direction.ASC, "_id"),
              limit(pageSize));
          
          List<RESULT_OBJECT> mappedResult = mongoTemplate.aggregate(agg, COLLECTION_NAME, RESULT_OBJECT.class).getMappedResults();
          

          【讨论】:

            【解决方案9】:

            spring-data-commons 2.3.5 版

            Sort 构造函数是私有的,所以:

            Query query = new Query();
            query.with(Sort.by(Sort.Direction.ASC,"pdate"));
            return mongoTemplate.find(query, Product.class);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-13
              • 1970-01-01
              • 1970-01-01
              • 2019-04-12
              • 2012-11-14
              • 2017-09-08
              • 1970-01-01
              • 2021-03-09
              相关资源
              最近更新 更多