7

我有以下查询(为简单起见,使用硬编码参数),使用 Spring 存储库中的“@Query”注释:

@Query("{$query : {status:'Failed'}, $maxScan: 10}")

此查询的目的是从数据库中读取状态为“失败”的前 10 条记录(这些记录是系统作业)。但是,查询将首先读取 10 条记录,然后从这 10 条记录中读取状态为“失败”的记录。

我需要在应用过滤器之后将限制应用于结果集,而不是之前。如何修改上述查询以返回应用过滤逻辑后读取的结果集的前 10 条记录,即状态为“失败”的前 10 条记录?

提前致谢。

4

2 回答 2

16

使用 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 个失败记录的第一页。

于 2013-11-12T23:35:30.760 回答
-2

$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" }
于 2013-11-12T21:18:26.570 回答