【问题标题】:How to sort by defined value in mongodb如何在mongodb中按定义的值排序
【发布时间】:2016-05-08 14:29:59
【问题描述】:

在我的项目中,我使用的是 SpringBoot 1.4.0-M2 和 MongoDb 3.0

我要实现排序。

我收集了一些文件:

{
"name":"Tim",
"age":19
}
,{
"name":"Jim",
"age":20
}
,{
"name":"Will",
"age":21
}
,{
"name":"Ed",
"age":22
}

我从 19 到 22 随机数,假设我得到的数字是 21。 现在我想使用我的 21 值按“年龄”属性排序。

我想要这样的订单 21,22,19,20 所以 Will,Ed,Tim,Jim

你知道如何排序吗?

最好的问候!

【问题讨论】:

    标签: spring mongodb spring-boot


    【解决方案1】:

    我不知道在单个查询中实现这种“包装排序”概念的方法,但您可以在两个查询中实现。下面的示例将所有内容加载到内存中,因此如果您只想在非常大的集合的情况下一次操作一个,则只需稍微更改一下即可。

    如果您使用的是本机 MongoDB Java 驱动程序 3.x:

    int age = 21;
    DBObject ageSort = new BasicDBObject("age", 1)
    List<Document> results = new ArrayList<>();
    mongoCollection.find(new BasicDBObject("age", new BasicDBObject("$gte", age)))
                   .sort(ageSort)
                   .forEach((Block<Document>) results::add);
    mongoCollection.find(new BasicDBObject("age", new BasicDBObject("$lt", age)))
                   .sort(ageSort)
                   .forEach((Block<Document>) results::add);
    

    如果您使用的是 Spring Data MongoDB:

    int age = 21;
    Sort ageSort = new Sort(new Sort.Order(Sort.Direction.ASC, "age"))
    List<Map> results = mongoTemplate.findAll(
        new Query(Criteria.where("age").gte(age)).with(ageSort),
        Map.class
    );
    results.addAll(mongoTemplate.findAll(
        new Query(Criteria.where("age").lt(age)).with(ageSort),
        Map.class
    ));
    

    【讨论】:

    • 我必须在单个查询中执行此操作,我认为我在文档中添加了其他属性来归档这种排序效果,您怎么看?
    • 抱歉,我不知道您如何在单个查询中实现此目的。除非您提前知道随机数是什么,否则我不知道您可以提前在文件中放入什么来帮助解决这个问题。你能分享一下为什么这必须是一个查询吗?
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多