Overview
在本指南中,您可以了解如何使用读取操作从 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 中指定的常用设置:
设置 | 说明 |
|---|---|
| 对结果进行排序时使用的排序规则。要进一步了解排序规则,请参阅排序规则指南。 |
| 用于操作的索引。要学习有关索引的更多信息,请参阅 MongoDB 服务器手册中的索引。 |
| 返回结果时使用的投影。 |
| 用于查找操作的读关注(read concern)。如果您未设置此选项,则该操作将继承为集合设置的读关注(read concern)。要学习有关读关注(read concern)的更多信息,请参阅服务器手册中的读关注(read concern)。 |
| 在返回结果时要跳过的文档数。要进一步了解如何使用 |
|
注意
实例化选项
Rust 驱动程序实现了 Builder 设计模式,用于创建许多不同类型,例如FindOneOptions或FindOptions 。 您可以使用每种类型的builder()方法,通过逐个链接选项构建器函数来构造选项实例。
有关可以为每种类型指定的设置的完整列表,请参阅 FindOptions 和 FindOneOptions 的API文档。
示例
以下部分包含使用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); };
Inventory { item: "watering can", category: "garden", unit_price: 11.99 } Inventory { item: "candle", category: "decor", unit_price: 2.89 }
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);
Some( Inventory { item: "watering can", category: "garden", unit_price: 11.99, }, )
聚合操作
使用聚合操作从collection中检索和转换数据。您可以使用aggregate()方法执行聚合操作。
聚合文档数据
aggregate()方法将聚合管道作为参数。 聚合管道包括一个或多个指定如何转换数据的阶段。 阶段包括聚合操作符(以$为前缀)以及该操作符所需的任何参数。
要了解有关聚合的更多信息并查看聚合示例,请参阅聚合指南。
该方法以Cursor类型返回结果文档。 如果聚合管道不包含$match阶段,则管道会处理集合中的所有文档。
修改聚合行为
您可以通过将AggregateOptions实例作为可选参数传递来修改aggregate()的行为。
要使用每个设置的默认值,请将值None指定为选项参数。
下表描述了您可以在AggregateOptions中指定的常用设置:
设置 | 说明 |
|---|---|
| 允许写入临时文件。如果 |
| 指定服务器每个游标批处理返回的最大文档数。此选项设置游标在内存中保留的文档数,而不是游标返回的文档数。 |
| 对结果进行排序时使用的排序规则。要进一步了解排序规则,请参阅排序规则指南。 |
| 用于操作的索引。要学习有关索引的更多信息,请参阅 MongoDB 服务器手册中的索引。 |
| 用于查找操作的读关注(read concern)。如果您未设置此选项,则该操作将继承为集合设置的读关注(read concern)。要学习有关读关注(read concern)的更多信息,请参阅服务器手册中的读关注(read concern)。 |
| 操作的写关注(write concern)。如果您未设置此选项,则操作会继承为集合设置的写关注(write concern)。要了解有关写关注(write 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); };
Document({"_id": Document({"category": String("decor")}), "avg_price": Double(2.890000104904175)}) Document({"_id": Document({"category": String("kitchen")}), "avg_price": Double(20.840000867843628)}) Document({"_id": Document({"category": String("garden")}), "avg_price": Double(11.989999771118164)})
更多信息
有关查找操作的可运行示例,请参阅以下用法示例:
要了解有关本指南中操作的更多信息,请参阅以下文档:
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: