限制返回结果的数量
概述
在本指南中,您可以学习如何使用MongoDB Rust驱动程序执行 limit 操作。这些操作指定从读取操作中返回的文档数量。
使用limit()
方法来限制读取操作可以返回的文档数量。如果文档数量不足,达到指定限制,则操作返回的文档更少。
如果您使用 limit()
方法与 skip()
方法一起使用,则跳过操作首先应用,然后限制才应用于剩余的文档。有关跳过操作的其他信息,请参阅跳过返回结果 指南。
示例数据的样本
本指南中的示例使用以下 Book
结构作为 books
集合中文档的模型
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() 方法示例
要限制返回的文档数,可以将 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 文档
要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档