Docs 菜单
Docs 主页
/ / /
Kotlin 协程
/ / /

限制返回结果的数量

在此页面上

  • Overview
  • 指定限制
  • 结合使用 Skip 和 Limit

在本指南中,您可以了解如何限制使用 MongoDB Kotlin 驱动程序从读取操作返回的结果数量。

使用 limit()来限制读取操作返回的文档数量。 此实例方法指定读取操作可以返回的最大文档数。 如果文档数量不足以达到指定的限制,则可以返回一个较小的数字。 如果将limit()skip()实例方法结合使用,则首先应用 skip,并且限制仅应用于在 skip 操作后剩余的文档。 有关skip()方法的更多信息,请参阅有关跳过返回的指南指南。

以下示例分别演示如何向集合中插入数据,如何使用 limit() 限制返回的文档数量,以及如何将 limit()skip() 组合以进一步缩小查询返回的结果范围。

以下各节提供更新此样本文档的示例:

{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 }
{ "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 }
{ "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 }
{ "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 }
{ "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 }

此数据使用以下 Kotlin 数据类进行建模:

data class Book(
@BsonId val id: Int,
val title: String,
val author: String,
val length: Int
)

下一个示例将查询该集合以返回长度排名前三的图书。 它首先将所有文档与查询进行匹配,然后对length字段进行排序,以先返回长度较长的书籍,然后返回长度较短的书籍。 最后,它将返回值限制为3文档,并返回以下三个文档,按长度排序:

val results = collection.find()
.sort(descending("length"))
.limit(3)
results.collect { println(it) }
Book(id=2, title=Les Misérables, author=Hugo, length=1462)
Book(id=6, title=A Dance with Dragons, author=Martin, length=1104)
Book(id=4, title=Infinite Jest, author=Wallace, length=1104)

提示

调用limit()sort()的顺序并不重要,因为 find 命令始终先应用排序,然后再应用限制。 以下两个调用是等效的:

collection.find().sort(descending("length")).limit(3)
collection.find().limit(3).sort(descending("length"))

要查看接下来的三本最长的书,请将skip()方法附加到find()调用中。 传递给skip()的整数参数将决定查找操作返回的文档数量。 此操作返回描述第四到第六长书籍的文档:

val results = collection.find()
.sort(descending("length"))
.skip(3)
.limit(3)
results.collect { println(it) }
Book(id=3, title=Atlas Shrugged, author=Rand, length=1088)
Book(id=5, title=Cryptonomicon, author=Stephenson, length=918)
Book(id=1, title=The Brothers Karamazov, author=Dostoyevsky, length=824)

您可以通过这种方式,结合 skip()limit() 来为您的集合实现分页,一次仅返回集合的小“切片”。

注意

为了确保在多个查询中稳定排序,必须使用唯一键(如 _id)进行排序。否则,当调用 skip()limit()sort() 相结合时,可能会产生不可预知的结果。

例如,考虑以下数据:

{ type: "computer", data: "1", serial_no: 235235 }
{ type: "computer", data: "2", serial_no: 235237 }
{ type: "computer", data: "3", serial_no: 235239 }
{ type: "computer", data: "4", serial_no: 235241 }

如果只按 type 排序,sort() 并不能保证返回时顺序不变。将 skip()limit() 追加到 sort() 中可能会导致不同的查询返回不同的文档。在这种情况下,按 dataserial_no 排序可以保证稳定排序,因为这两个键都是唯一键。

有关本指南中提到的方法和类的详情,请参阅以下 API 文档:

  • FindFlow.collect()

  • MongoCollection.find()

后退

跳过返回的结果