MongoDB Sort() 和 Limit() 查询及 Order By 示例
⚡ 智能摘要
MongoDB sort() 和 limit() 查询修饰符控制查询返回的文档数量和排序方式。limit() 方法限制结果数量上限,而 sort() 使用 1 或 -1 的值按升序或降序排列文档。

什么是查询修改?
蒙戈数据库 提供查询修饰符,例如“limit”和“Orders”子句,以便在执行查询时提供更多灵活性。我们将介绍以下查询修饰符
MongoDB 限制查询结果
此修饰符用于限制查询结果集中返回的文档数量。以下示例显示了如何做到这一点。
db.Employee.find().limit(2).forEach(printjson);
Code 说明
- 上述代码采用了 find 函数,该函数返回集合中的所有文档,然后使用 limit 子句将返回的文档数量限制为仅 2 个。
输出
如果命令执行成功,将显示以下输出
输出清楚地表明,由于存在限制修饰符,因此根据 ObjectId 按升序排列最多仅返回 2 条记录作为结果集的一部分。
MongoDB 按降序排序
可以根据集合中任意键的升序或降序指定要返回的文档的顺序。以下示例显示了如何执行此操作。
db.Employee.find().sort({Employeeid:-1}).forEach(printjson)
Code 说明
- 上述代码采用了 sort 函数,该函数返回集合中的所有文档,然后使用修饰符来更改返回记录的顺序。此处的 -1 表示我们希望根据员工 ID 的降序返回文档。
如果命令执行成功,将显示以下输出
输出
输出清楚地显示了按 Employeeid 降序排列返回的文档。
升序由值 1 定义。
MongoDB 按升序排序
就像 sort() 函数可以按降序返回文档一样,它也可以按升序返回文档。升序由 sort 对象中的值 1 定义。这将文档按值从小到大排列,这对于按时间顺序(从旧到新或从 A 到 Z)列出记录非常有用。
以下示例按员工 ID 升序排列所有员工文档:
db.Employee.find().sort({Employeeid:1}).forEach(printjson)
查询语句的工作原理如下:
- find() 函数检索 Employee 集合中的所有文档。
- sort({Employeeid:1}) 按 Employeeid 字段对结果进行排序,从 id 最小到最大。
- forEach(printjson) 以可读的 JSON 格式打印每个文档。
运行此命令后,文档将按 Employeeid 升序排列。升序也是默认方向,因此将值设为 1 将按所选字段从低到高排序。要反转结果,只需将值从 1 改为 -1 即可。您还可以链式调用 limit() 函数,仅返回排序后的前几条记录。
MongoDB Skip() 用于分页
skip() 方法告诉 MongoDB 跳过指定数量的文档,然后返回剩余的文档。单独使用 `skip()` 函数很少有用,但与 `limit()` 函数结合使用可以实现分页,让你一次显示一页结果。
以下示例跳过前两名员工,直接返回后两名员工:
db.Employee.find().skip(2).limit(2).forEach(printjson)
要构建逐页导航,请遵循以下模式:
- 确定页面大小,例如每页 2 个文档。
- 将页面尺寸乘以页码减一,即可得到跳过值。
- 将该值传递给 skip(),并将页面大小传递给 limit()。
例如,第 1 页使用 skip(0).limit(2),第 2 页使用 skip(2).limit(2),第 3 页使用 skip(4).limit(2)。务必同时添加 sort() 函数,以确保文档顺序在各页之间保持一致。请注意,对于大型集合,过大的 skip 值可能会导致速度变慢,因为 MongoDB 仍然会扫描并丢弃跳过的文档;基于范围的分页在大规模应用时速度更快。
按多个字段排序 MongoDB
MongoDB 可以同时按多个字段排序。您需要在排序对象中按优先级顺序列出字段,并且 MongoDB 首先按第一个字段排序,然后使用下一个字段打破平局,依此类推。
以下示例按姓名升序排列员工,对于同名员工,按员工 ID 降序排列:
db.Employee.find().sort({EmployeeName:1, Employeeid:-1}).forEach(printjson)
排序对象中键的顺序很重要:EmployeeName 首先被应用,因为它出现在列表的最前面。这种多键排序适用于按单个字段分组,然后在每个组内进行排名的报表。为了在大数据集上获得最佳性能,请创建一个与排序中使用的字段和方向相匹配的复合索引。


