【发布时间】:2018-05-01 12:34:20
【问题描述】:
我有一个这样的用例。我的 Mongo DB 中有问题,并且有一个 CRUD 微服务。在那里,我公开了一个 API 方法,通过查询参数给出的 ID 列表来获取问题。为了简单起见,用户给/api/questions?id=2, id=7, id=4, id = 5
然后我需要以完全相同的顺序返回问题列表,就像这样
questions: [
{
id: 2,
prompt: "prompt one",
...
},
{
id: 7,
prompt: "prompt two",
...
},
{
id: 4,
...
},
{
id: 5
...
}
]
但请注意,这既不是 ASC 也不是 DESC,而是可以是任意顺序,例如 /api/questions?id=2, id=7, id=4, id=5
我使用org.springframework.data.mongodb.repository.MongoRepository 作为我的DAO 课程。目前,在通过基于 spring-data 的存储库获取数据后,我正在我的服务层内进行排序。该解决方案有效。但我更愿意在 DAO 存储库级别本身完成此排序,因为它成本更低,并且不会在服务层为我的业务逻辑增加不必要的复杂性。相反,我可以仅将责任委托给数据库,假设它更有能力通过更多优化来做这些事情。
我可以使用弹簧数据来实现这一点吗? 如果是这样,如何完成那件事?
【问题讨论】:
-
questions是您结构的数组字段吗?如果是,那么它是可能的,但你必须使用聚合,因为排序数组比排序任何其他不是数组的字段有点棘手。如果您可以提供数据结构的虚拟示例,我可以为您提供帮助。另外,您使用正确的查询来获取文档? -
我现在使用默认的
this.questionRepository.findAll(ids);。我正在寻找一种浓缩的方式。我相信聚合会更冗长。不是这样吗?我在那个存储库中没有mongoTemplate。 -
它更冗长,但如果你想对数组进行排序,没有办法绕过它。它仍然会比在你的代码中排序更快。但如果您的
ids不在数组中,您可以使用this.questionRepository.findAll(ids).sort({id: -1});或sort({id: 1});。正如我所说,如果您使用虚拟文档更新您的问题,那么我可以告诉您是只需要排序还是聚合。 -
我已根据您的要求添加了文档结构。如果有一种简洁的方法,请告诉我。谢谢!
-
你粘贴了一张图片。一个虚拟的json会很棒。但无论如何,现在至少很清楚您必须使用聚合,并且您必须
$unwind您的数组才能订购它。你提到你这样搜索this.questionRepository.findAll(ids)ids是什么?因为我无法想象"options.id": { $in: [2, 7, 4, 5]}将返回仅包含具有id:2, id:7, id:4 and id:5的数组的文档。它还将返回具有id:2, id:8, id:4 and id:5的数组
标签: java spring mongodb spring-boot spring-data