检索数据
概述
在本指南中,您可以了解如何使用读取操作从 MongoDB collection中检索数据。读取操作是从服务器检索文档的命令。
有两种类型的读取操作:
查找操作,允许您从collection中检索文档
聚合操作,允许转换collection中的数据
本指南包括以下部分:
示例样本数据
本指南中的示例使用以下样本文档。 每个文档代表商店库存中的一个商品,并包含有关其分类和单价的信息:
let docs = vec! [ Inventory { item: "candle".to_string(), category: "decor".to_string(), unit_price: 2.89, }, Inventory { item: "blender".to_string(), category: "kitchen".to_string(), unit_price: 38.49, }, Inventory { item: "placemat".to_string(), category: "kitchen".to_string(), unit_price: 3.19, }, Inventory { item: "watering can".to_string(), category: "garden".to_string(), unit_price: 11.99, } ];
查找操作
使用查找操作从 MongoDB 检索数据。 查找操作由 、 find()
和find_one()
方法组成。
查找所有匹配文档
要查找所有符合条件的文档,请使用find()
方法。 此方法将查询筛选器作为参数。 查询筛选器由构成要匹配的文档条件的字段和值组成。
该方法返回一个Cursor
类型,您可以遍历该类型以检索与过滤条件匹配的任何文档。
要查看使用此方法检索数据的示例,请参阅find() 示例。
要了解有关指定查询的更多信息,请参阅指定查询指南。
查找一个文档
要查找第一个符合条件的文档,请使用find_one()
方法。 此方法将查询筛选器作为参数。 查询筛选器由构成要匹配的文档条件的字段和值组成。
如果文档与筛选条件匹配,该方法将返回值为Some
的Result<Option<T>>
类型。 如果没有符合筛选条件的文档, find_one()
将返回值为None
的Result<Option<T>>
类型。
要查看使用此方法检索数据的示例,请参阅find_one() 示例。
修改查找行为
您可以通过传递FindOptions
实例作为参数来修改find()
的行为,也可以通过传递FindOneOptions
实例来修改find_one()
的行为。
要使用每个设置的默认值,请将值None
指定为选项参数。
下表描述了您可以在 FindOptions
和 FindOneOptions
中指定的常用设置:
设置 | 说明 |
---|---|
collation | |
hint | |
projection | 返回结果时要使用的投影。 类型: Document 默认: None |
read_concern | |
skip | 返回结果时要跳过的文档数。 类型: u64 默认: None |
sort |
注意
实例化选项
Rust 驱动程序实现了 Builder 设计模式,用于创建许多不同类型,例如FindOneOptions
或FindOptions
。 您可以使用每种类型的builder()
方法,通过逐个链接选项构建器函数来构造选项实例。
有关可以为每种类型指定的设置的完整列表,请参阅 FindOptions 的 API 文档 和 FindOneOptions。
举例
以下部分包含使用find()
和findOne()
方法检索与过滤条件匹配的样本文档的示例。
find() 示例
此示例演示如何使用以下参数调用find()
方法:
查询筛选器,用于匹配
unit_price
值小于12.00
且category
值不为"kitchen"
的文档一个实例,用于按
FindOptions
降序排列匹配的文档unit_price
let opts = FindOptions::builder() .sort(doc! { "unit_price": -1 }) .build(); let mut cursor = my_coll.find( doc! { "$and": vec! [ doc! { "unit_price": doc! { "$lt": 12.00 } }, doc! { "category": doc! { "$ne": "kitchen" } } ] }, opts ).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); };
find_one() 示例
此示例演示如何使用以下参数调用find_one()
方法:
查询筛选器,用于匹配
unit_price
值小于或等于20.00
的文档跳过前两个匹配文档的
FindOneOptions
实例
let opts = FindOneOptions::builder().skip(2).build(); let result = my_coll.find_one( doc! { "unit_price": doc! { "$lte": 20.00 } }, opts ).await?; println!("{:#?}", result);
聚合操作
使用聚合操作从collection中检索和转换数据。您可以使用aggregate()
方法执行聚合操作。
聚合文档数据
aggregate()
方法将聚合管道作为参数。 聚合管道包括一个或多个指定如何转换数据的阶段。 阶段包括聚合操作符(以$
为前缀)以及该操作符所需的任何参数。
要了解有关聚合的更多信息并查看聚合示例,请参阅聚合指南。
该方法以Cursor
类型返回结果文档。 如果聚合管道不包含$match阶段,则管道会处理集合中的所有文档。
修改聚合行为
您可以通过将AggregateOptions
实例作为可选参数传递来修改aggregate()
的行为。
要使用每个设置的默认值,请将值None
指定为选项参数。
下表描述了您可以在AggregateOptions
中指定的常用设置:
设置 | 说明 |
---|---|
allow_disk_use | 允许写入临时文件。 如果 true ,则聚合阶段可以将数据写入dbPath 目录中的_tmp 子目录。类型: bool 默认: false |
batch_size | 指定服务器在每个游标批处理中返回的最大文档数。 此选项设置游标在内存中保留的文档数,而不是游标返回的文档数。 类型: u32 默认:最初有 101 个文档,后续批处理的最大数量为16 MB |
collation | |
hint | |
read_concern | |
write_concern |
有关设置的完整列表,请参阅 AggregateOptions 的 API 文档。
例子
此示例演示如何使用包含以下阶段的管道调用aggregate()
方法:
$group
阶段,按category
字段对文档进行分组,并按category
计算unit_price
字段的平均值$sort
阶段(按avg_price
升序排列)
let pipeline = vec![ doc! { "$group": doc! { "_id" : doc! {"category": "$category"} , "avg_price" : doc! { "$avg" : "$unit_price" } } }, doc! { "$sort": { "_id.avg_price" : 1 } } ]; let mut cursor = my_coll.aggregate(pipeline, None).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); };
更多信息
有关查找操作的可运行示例,请参阅以下用法示例:
要了解有关本指南中操作的更多信息,请参阅以下文档:
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: