跳过返回的结果
Overview
在本指南中,您可以了解如何使用 MongoDB Java 驱动程序跳过读取操作中返回的指定数量的结果。
您可以使用 skip()
方法跳过查询返回结果上的结果。 您还可以通过指定$skip
聚合阶段来跳过聚合管道中特定阶段的文档。
skip()
方法接受一个整数,该整数指定要从 FindIterable 返回的文档列表的开头省略的文档数。
您可以使用skip()
方法跳过前两个文档,如下所示:
collection.find().skip(2);
Aggregates.skip() 是聚合管道中的可选阶段,用于指定从上一阶段结果的开头算起要省略的文档数量。
您可以使用Aggregates.skip()
方法跳过前两个文档,如下所示:
import com.mongodb.client.model.Aggregates; collection.aggregate(Arrays.asList(Aggregates.match(), 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 }
为了解决这种情况,油漆店需要使用空筛选器查询paint_inventory
collection,按qty
字段对文档进行排序并省略前五个结果。
使用 FindIterable
import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; // Add your MongoCollection setup code here Bson filter = Filters.empty(); collection.find(filter) .sort(Sorts.descending("qty")) .skip(5) .forEach(doc -> System.out.println(doc.toJson()));
find()
方法会返回所有文档。sort()
方法根据qty
字段从最高到最低指定要显示的文档。skip()
方法指定省略前五个文档。
使用聚合
import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import com.mongodb.client.model.Aggregates; // Add your MongoCollection setup code here Bson filter = Filters.empty(); collection.aggregate(Arrays.asList( Aggregates.match(filter), Aggregates.sort(Sorts.descending("qty")), Aggregates.skip(5))) .forEach(doc -> System.out.println(doc.toJson()));
match()
阶段会返回所有文档。sort()
阶段根据qty
字段从最高到最低指定要显示的文档。skip()
阶段指定省略前五个文档。
以下显示了前面两个查询的输出:
{ "_id": 4, "color": "white", "qty": 6 } { "_id": 1, "color": "red", "qty": 5 } { "_id": 6, "color": "pink", "qty": 3 }
油漆店运行查询后,发现最畅销的三种颜色是粉色、红色和白色。
注意
如果 skip 的值大于或等于查询的匹配文档数,则该查询不返回任何文档。
如果上例中的skip()
方法跳过前九个文档,则不会返回任何结果,因为指定的数量超过了匹配文档的数量。
Bson filter = Filters.empty(); collection.find(filter) .sort(Sorts.descending("qty")) .skip(9) .forEach(doc -> System.out.println(doc.toJson()));