跳过返回的结果
Overview
在本指南中,您可以了解如何使用 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( val id: Int, val qty: Int, val color: String )
为了解决这种情况,油漆店需要使用空筛选器查询paint_inventory
collection,按qty
字段对文档进行排序并省略前五个结果。
使用 FindIterable
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) }