在Spring Repository中的MongoDB查询:在筛选后限制记录数量

8
我有以下查询(为了简单起见,使用硬编码参数),在Spring存储库中使用“@Query”注释:
@Query("{$query : {status:'Failed'}, $maxScan: 10}")
这个查询的目的是从数据库中读取前10条状态为“失败”的记录(这些记录是系统作业)。但是,该查询将首先读取10条记录,然后从这10条记录中读取具有“失败”状态的记录。
我需要在应用筛选器之后对结果集应用限制,而不是在之前。如何修改上述查询以返回在应用筛选逻辑后读取的结果集的前10条记录,即具有“失败”状态的前10条记录?
提前感谢。

问题已解决。Pageable 解决了这个问题。不确定之前为什么会出现错误,但现在它可以工作了。谢谢 ku*。 - user2984914
2个回答

18

使用Spring Data MongoDB时,通常希望使用Pageable接口进行这些查询。例如:

@Query("{status: 'Failed'}")
List<Record> findFailedRecords(Pageable pageable);

// or even better without the @Query annotation just:

List<Record> findByStatus(String status, Pageable pageable);

然后,要进行调用:

yourRecordRepo.findFailedRecords(new PageRequest(0, 10));

// or using the other method:

yourRecordRepo.findByStatus("Failed", new PageRequest(0, 10));

这将获取前10个失败记录的第一页。


1
我尝试过使用Pageable,但在Spring repository中使用Query注释时会出现错误。我的查询比较复杂,因此需要Query,我发布了一个简单的查询,以便我们有一个清晰的示例。我需要能够解决这个问题,使用Query注释,任何帮助都将不胜感激! - user2984914
我怎样才能获取最近的N条记录? - tprieboj
嗨,这个可以用...但是我怎么知道有多少页呢?或者有没有一种简单的方法可以知道记录/结果的总数,以便我可以计算出页数...然后我就可以使用PageRequest循环到每一页了? - Borgy Manotoy
顺便说一下,我正在使用JSON查询和可分页的方式...但我不知道如何从JSON查询中获取结果计数。 - Borgy Manotoy
4
新的PageRequest(0,10)已经被弃用,请使用PageRequest.of(0, 10)。 - visrahane

-4

$limit 是你需要的。

Limit - http://docs.mongodb.org/manual/reference/method/cursor.limit/#cursor.limit

mongos> db.test.find()
{ "_id" : 1, "status" : "Failed" }
{ "_id" : 2, "status" : "Pass" }
{ "_id" : 3, "status" : "Failed" }
{ "_id" : 4, "status" : "Pass" }
{ "_id" : 5, "status" : "Failed" }
{ "_id" : 6, "status" : "Pass" }
{ "_id" : 7, "status" : "Failed" }
{ "_id" : 8, "status" : "Pass" }
{ "_id" : 9, "status" : "Failed" }
{ "_id" : 10, "status" : "Pass" }
mongos> db.test.find({status: "Failed"})
{ "_id" : 1, "status" : "Failed" }
{ "_id" : 3, "status" : "Failed" }
{ "_id" : 5, "status" : "Failed" }
{ "_id" : 7, "status" : "Failed" }
{ "_id" : 9, "status" : "Failed" }
mongos> db.test.find({status: "Failed"}).limit(3)
{ "_id" : 1, "status" : "Failed" }
{ "_id" : 3, "status" : "Failed" }
{ "_id" : 5, "status" : "Failed" }

我尝试了"$limit",但没有起作用。这是我使用的语法,但这会从数据库获取所有记录(状态为"Failed"):@Query("{$query : {status:'Failed'}, $limit: 10}")。这个语法正确吗? - user2984914
@user2984914使用limit更新了答案,并提供了一个样本测试数据。 - Ajay George
4
@AjayGeorge,这句话翻译成Java代码时(使用Spring框架),如何实现?这就是问题所在。 - PatS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接