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

跳过返回的结果

在此页面上

  • Overview
  • 示例
  • 使用 FindIterable
  • 使用聚合

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

您可以使用 skip()方法跳过查询返回结果上的结果。 您还可以通过指定$skip聚合阶段来跳过聚合管道中特定阶段的文档。

skip()方法接受一个整数,该整数指定要从 FindFlow 返回的文档列表的开头省略的文档数。

您可以使用skip()方法跳过前两个文档,如下所示:

collection.find().skip(2)

Aggregates.skip() 是聚合管道中的可选阶段,用于指定从上一阶段结果的开头算起要省略的文档数量。

您可以使用Aggregates.skip()方法跳过前两个文档,如下所示:

val filter = Filters.empty()
val results = collection.aggregate(listOf(
Aggregates.match(filter),
Aggregates.skip(2))
)

以下示例涉及一家销售八种不同颜色油漆的油漆店。 最好的颜色比其他颜色卖得更快。 一天,一位客户询问最畅销(库存最低)的三种颜色是什么。 涂料商店在其paint_inventory集合的qty字段中跟踪库存:

{ "_id": 1, "color": "red", "qty": 5 }
{ "_id": 2, "color": "purple", "qty": 10 }
{ "_id": 3, "color": "blue", "qty": 9 }
{ "_id": 4, "color": "white", "qty": 6 }
{ "_id": 5, "color": "yellow", "qty": 11 }
{ "_id": 6, "color": "pink", "qty": 3 }
{ "_id": 7, "color": "green", "qty": 8 }
{ "_id": 8, "color": "orange", "qty": 7 }

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

data class PaintOrder(
@BsonId val id: Int,
val qty: Int,
val color: String
)

为了解决这种情况,油漆店需要使用空筛选器查询paint_inventorycollection,按qty字段对文档进行排序并省略前五个结果。

val filter = Filters.empty()
val results = collection.find(filter)
.sort(descending(PaintOrder::qty.name))
.skip(5)
results.collect { println(it) }
PaintOrder(id=4, qty=6, color=white)
PaintOrder(id=1, qty=5, color=red)
PaintOrder(id=6, qty=3, color=pink)
  • find()方法会返回所有文档。

  • sort()方法根据qty字段从最高到最低指定要显示的文档。

  • skip()方法指定省略前五个文档。

val filter = Filters.empty()
val aggregate = listOf(
Aggregates.match(filter),
Aggregates.sort(descending(PaintOrder::qty.name)),
Aggregates.skip(5)
)
val findFlow = collection.aggregate(aggregate)
findFlow.collect { println(it) }
PaintOrder(id=4, qty=6, color=white)
PaintOrder(id=1, qty=5, color=red)
PaintOrder(id=6, qty=3, color=pink)
  • match()阶段会返回所有文档。

  • sort()阶段根据qty字段从最高到最低指定要显示的文档。

  • skip()阶段指定省略前五个文档。

油漆店运行查询后,发现最畅销的三种颜色是粉色、红色和白色。

注意

如果 skip 的值大于或等于查询的匹配文档数,则该查询不返回任何文档。

如果上例中的skip()方法跳过前九个文档,则不会返回任何结果,因为指定的数量超过了匹配文档的数量。

val filter = Filters.empty()
val emptyQuery = listOf(
Aggregates.match(filter),
Aggregates.sort(descending(PaintOrder::qty.name)),
Aggregates.skip(9)
)
val findFlow = collection.aggregate(emptyQuery)
findFlow.collect { println(it) }

后退

对结果进行排序