我尝试通过Spring Sort
对象(包含2个特定字段)对mongo中的数据进行排序。
出于某种原因,Spring更改了“排序字段”的顺序。
我使用Spring和MongoDB数据(MongoTemplate
)。我使用findAll()
函数来获取一些记录。
在mongo数据中,我有特定的索引{ "status": -1, "_id": -1 }
。
我想按此特定索引排序,为此,我添加了以下代码进行排序:
new Sort(Sort.Direction.DESC, "status").and(new Sort(Sort.Direction.DESC,
"_id"));
我先按status
字段排序,然后再按_id
字段排序(如索引)。
我使用其他索引并对它们进行排序,而Spring不会对我的“排序字段”进行排序:
{ "status": -1, "__sort_authors": 1 }
{ "status": -1, "__sort_title": 1 }
在这些情况下,Spring会将排序字段的顺序保存在Mongo查询中:
查询:{...}, Sort: { "status":-1, "__sort_authors":1 }
查询:{...}, Sort: { "status":-1, "__sort_title":1 }
预期的mongo查询应为:
{“ foldersIds”:{“ $ in”:[“ project:6s5d4f32sd1f65”]},“ availability”:“ PRESENT”},字段:{},排序:{“ status”:-1, “ _id”:-1}
实际的mongo查询为:
{“ foldersIds”:{“ $ in”:[“ project:5c505594e4b0e98a6537ec9d”]},“ availability”:“ PRESENT”},字段:{},排序:{“ _id”:-1, “状态”:-1}
也许是因为_id
是主要字段吗?
我想保留排序字段的顺序。知道如何保存订单吗?
谢谢!
答案 0 :(得分:1)
我将尝试通过传递List
而不是调用and
方法来显式设置顺序。像这样:
ArrayList<Order> orders = new ArrayList<>();
orders.add(new Sort.Order(Sort.Direction.DESC, "status"));
orders.add(new Sort.Order(Sort.Direction.DESC, "_id"));
Sort sort = Sort.by(orders);
我之所以建议这样做,是因为Sort.and()
方法的文档仅指定它结合了指定的种类,没有指定如何或以何种顺序结合它们。希望使用List
可以强制执行所需的顺序。