文档菜单
文档首页
/ / /
Kotlin 协程

限制返回结果的数量

在本页

  • 概述
  • 指定限制
  • 组合跳过和限制

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

使用limit()来限制读取操作返回的文档数量。此实例方法指定读取操作可以返回的最大文档数量。如果没有足够的文档达到指定的限制,它可以返回更小的数量。如果您使用limit()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() 的整数参数将确定 find 操作返回的文档数量。此操作返回描述第四到第六长书籍的文档

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)进行排序。否则,与 sort() 结合使用 skip()limit() 可能会产生不可预测的结果。

例如,考虑以下数据

{ 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 }

如果您只按 类型 排序,sort() 在返回时并不能保证相同的顺序。在 sort() 后附加 skip()limit() 可能会导致不同的查询返回不同的文档。在这种情况下,按 数据序列号 排序可以保证稳定的排序,因为这两个都是唯一的键。

有关本指南中提到的方法和类的更多信息,请参阅以下API文档

  • FindFlow.collect()

  • MongoCollection.find()

下一页

MongoDB Kotlin 驱动程序