文档菜单
文档首页
/ / /
Rust 驱动程序
/ / /

限制返回结果的数量

本页

  • 概述
  • 示例数据的示例
  • 限制文档
  • limit() 方法示例
  • 选项示例
  • 聚合示例
  • 附加信息
  • API 文档

在本指南中,您可以学习如何使用MongoDB Rust驱动程序执行 limit 操作。这些操作指定从读取操作中返回的文档数量。

使用limit() 方法来限制读取操作可以返回的文档数量。如果文档数量不足,达到指定限制,则操作返回的文档更少。

如果您使用 limit() 方法与 skip() 方法一起使用,则跳过操作首先应用,然后限制才应用于剩余的文档。有关跳过操作的其他信息,请参阅跳过返回结果 指南。

本指南中的示例使用以下 Book 结构作为 books 集合中文档的模型

#[derive(Debug, Serialize, Deserialize)]
struct Book {
name: String,
author: String,
length: i32,
}

以下代码演示如何将样本数据插入到 books 集合中

let uri = "connection string";
let client = Client::with_uri_str(uri).await?;
let my_coll: Collection<Book> = client.database("db").collection("books");
let books = vec![
Book {
id: 1,
name: "The Brothers Karamazov".to_string(),
author: "Dostoyevsky".to_string(),
length: 824,
},
Book {
id: 2,
name: "Atlas Shrugged".to_string(),
author: "Rand".to_string(),
length: 1088,
},
Book {
id: 3,
name: "Les Misérables".to_string(),
author: "Hugo".to_string(),
length: 1462,
},
Book {
id: 4,
name: "A Dance with Dragons".to_string(),
author: "Martin".to_string(),
length: 1104,
},
];
my_coll.insert_many(books).await?;

您可以在查询或聚合管道中指定要返回的最大文档数。

本节介绍了以下几种限制结果的方法

  • limit() 方法:将 limit() 方法链接到 find() 方法

  • FindOptions 结构体:使用 limit 选项

  • 聚合管道:创建一个使用 $limit 阶段的管道

要限制返回的文档数,可以将 limit() 方法链接到 find() 方法。

以下示例运行了一个 find() 操作,执行以下操作

  • length 字段值的升序排序结果

  • 将结果限制为前三个文档

let mut cursor = my_coll
.find(doc! {})
.sort(doc! { "length": 1 })
.limit(3).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Book { name: "The Brothers Karamazov", author: "Dostoyevsky", length: 824 }
Book { name: "Atlas Shrugged", author: "Rand", length: 1088 }
Book { name: "A Dance with Dragons", author: "Martin", length: 1104 }

如果您正在设置和重复使用查询的选项,可以使用 FindOptions。通过使用 limit() 选项构建器方法设置 FindOptions 结构的 limit 字段。然后,将 with_options() 方法链接到 find() 方法,并将您的 FindOptions 结构作为参数传递给 with_options() 方法。

以下示例运行了一个 find() 操作,执行以下操作

  • 筛选结果,只包含 length 字段大于 1000 的文档

  • length 字段值的升序排序结果

  • 限制结果只包含前两个文档

let filter = doc! { "length": { "$gt": 1000 } };
let find_options = FindOptions::builder()
.sort(doc! { "length": 1 })
.limit(2)
.build();
let mut cursor = my_coll.find(filter).with_options(find_options).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Book { name: "Atlas Shrugged", author: "Rand", length: 1088 }
Book { name: "A Dance with Dragons", author: "Martin", length: 1104 }

您可以使用聚合管道中的 $limit 阶段来限制返回的结果。有关聚合操作的高级信息,请参阅聚合指南。

此示例运行一个聚合管道,执行以下操作:

  • length 字段的降序排序结果

  • 限制返回结果只包含前两个文档

let pipeline = vec![
doc! { "$match": {} },
doc! { "$sort": { "length": -1 } },
doc! { "$limit": 2 },
];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Document({"_id": Int32(3), "name": String("Les Misérables"), "author": String("Hugo"), "length": Int32(1462)})
Document({"_id": Int32(4), "name": String("A Dance with Dragons"), "author": String("Martin"), "length": Int32(1104)})

要了解本指南中提到的操作,请参阅以下指南

要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档

后退

跳过结果