检索数据
概述
本指南将指导您如何使用读取操作从MongoDB集合中检索数据。读取操作是从服务器检索文档的命令。
读取操作有两种类型:
查找操作,允许您从集合中检索文档
聚合操作,允许您转换集合中的数据
本指南包括以下部分:
示例数据
本指南中的示例使用以下示例文档。每个文档代表商店库存中的项目,并包含有关其分类和单价的信息。
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()
和 find_one()
方法。
查找所有匹配的文档
要查找符合您条件的所有文档,请使用 find()
方法。此方法接受一个查询过滤器作为参数。查询过滤器由构成文档匹配条件的字段和值组成。
该方法返回一个 Cursor
类型,您可以迭代它以检索任何符合过滤器条件的文档。
要查看使用此方法检索数据的示例,请参阅 find() 示例。
要了解有关指定查询的更多信息,请参阅 指定查询指南。
查找单个文档
要查找第一个符合您条件的文档,请使用find_one()
方法。此方法需要一个查询过滤器作为参数。查询过滤器由用于形成文档匹配条件的字段和值组成。
如果文档符合过滤器条件,该方法返回一个值为Some
的Result<Option<T>>
类型。如果没有文档符合过滤器条件,find_one()
返回一个值为None
的Result<Option<T>>
类型。
要查看使用此方法检索数据的示例,请参阅find_one()示例。
修改查找行为
您可以通过将FindOptions
选项构建器方法链接到find()
来修改find()
方法的行为,并通过将FindOneOptions
选项构建器方法链接到find_one()
来修改find_one()
方法的行为。
以下表格描述了您可以调用其对应构建器方法设置的常用FindOptions
和FindOneOptions
字段
字段 | 描述 |
---|---|
collation | |
hint | |
projection | 返回结果时使用的投影。 类型: Document 默认值: None |
read_concern | |
skip | |
sort |
注意
设置选项
您可以通过直接将选项构建器方法链接到查找操作方法调用来设置FindOptions
和FindOneOptions
字段。如果您正在使用驱动程序的早期版本,您必须通过将选项构建器方法链接到builder()
方法来构建一个FindOptions
或FindOneOptions
实例。然后,将您的选项实例作为参数传递给find()
或find_one()
。
有关可以为每种类型指定的完整设置列表,请参阅FindOptions和FindOneOptions.
示例
以下部分包含使用find()
和findOne()
方法检索符合过滤条件的示例文档的示例。
find() 示例
此示例执行以下操作
调用
find()
方法将查询过滤器传递给
find()
,以匹配值小于12.00
的unit_price
且category
值不为"厨房"
的文档将
sort()
方法链接到find()
以按降序排序匹配的文档的unit_price
let mut cursor = my_coll .find(doc! { "$and": vec! [ doc! { "unit_price": doc! { "$lt": 12.00 } }, doc! { "category": doc! { "$ne": "kitchen" } } ] }) .sort(doc! { "unit_price": -1 }) .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()
方法将查询过滤器传递给
find_one()
,以匹配值小于或等于20.00
的unit_price
的文档将
skip()
方法链接到find_one()
以跳过前两个匹配的文档
let result = my_coll .find_one(doc! { "unit_price": doc! { "$lte": 20.00 } }) .skip(2) .await?; println!("{:#?}", result);
Some( Inventory { item: "watering can", category: "garden", unit_price: 11.99, }, )
聚合操作
使用聚合操作从您的集合中检索和转换数据。您可以通过使用 aggregate()
方法来执行聚合操作。
聚合文档数据
aggregate()
方法接受一个 聚合管道 作为参数。聚合管道包含一个或多个 阶段,这些阶段指定如何转换数据。一个阶段包括一个聚合运算符(以 $
为前缀)以及该运算符所需的任何参数。
要了解有关聚合的更多信息并查看聚合示例,请参阅聚合指南。
该方法返回结果文档的 Cursor
类型。如果您的聚合管道不包含 $match 阶段,则管道将处理集合中的所有文档。
修改聚合行为
您可以通过将AggregateOptions
选项构建器方法链接到aggregate()
方法来修改aggregate()
方法的行为。
以下表格描述了您可以通过调用其相应构建器方法设置的常用AggregateOptions
字段
字段 | 描述 |
---|---|
allow_disk_use | 启用写入临时文件。如果设置为 true ,聚合阶段可以将数据写入dbPath 目录下的_tmp 子目录。类型: bool 默认值: false |
batch_size | 指定服务器每次通过游标批量返回的最大文档数。此选项设置游标在内存中保持的文档数,而不是游标返回的文档数。 类型: u32 默认值: 初始时为 101 个文档,后续批次的最大值为16 MB |
collation | |
hint | |
read_concern | |
write_concern |
有关完整设置列表,请参阅AggregateOptions
示例
此示例展示了如何使用包含以下阶段的管道调用aggregate()
方法
$group
阶段计算每个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).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 文档