Docs 菜单
Docs 主页
/ / /
Rust 驱动程序
/ / /

检索数据

在此页面上

  • 概述
  • 示例样本数据
  • 查找操作
  • 查找所有匹配文档
  • 查找一个文档
  • 修改查找行为
  • 举例
  • 聚合操作
  • 聚合文档数据
  • 修改聚合行为
  • 例子
  • 更多信息
  • API 文档

在本指南中,您可以了解如何使用读取操作从 MongoDB collection中检索数据。读取操作是从服务器检索文档的命令。

有两种类型的读取操作:

  • 查找操作,允许您从collection中检索文档

  • 聚合操作,允许转换collection中的数据

本指南包括以下部分:

  • 示例的样本数据显示了读取操作示例使用的样本数据

  • 查找操作描述了如何使用驱动程序执行查找操作

  • 聚合操作描述了如何使用驱动程序执行聚合操作

  • 其他信息提供了指向本指南中提及的类型和方法的资源和 API 文档的链接

本指南中的示例使用以下样本文档。 每个文档代表商店库存中的一个商品,并包含有关其分类和单价的信息:

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()方法。 此方法将查询筛选器作为参数。 查询筛选器由构成要匹配的文档条件的字段和值组成。

如果文档与筛选条件匹配,该方法将返回值为SomeResult<Option<T>>类型。 如果没有符合筛选条件的文档, find_one()将返回值为NoneResult<Option<T>>类型。

要查看使用此方法检索数据的示例,请参阅find_one() 示例。

您可以通过传递FindOptions实例作为参数来修改find()的行为,也可以通过传递FindOneOptions实例来修改find_one()的行为。

要使用每个设置的默认值,请将值None指定为选项参数。

下表描述了您可以在 FindOptionsFindOneOptions 中指定的常用设置:

设置
说明
collation
对结果进行排序时使用的排序规则。要了解有关排序规则的更多信息,请参阅排序规则指南。

类型: Collation
默认: None
hint
用于操作的索引。要了解有关索引的更多信息,请参阅服务器手册中的索引

类型: Hint
默认: None
projection
返回结果时要使用的投影。

类型: Document
默认: None
read_concern
用于查找操作的读关注。如果不设置此选项,该操作将继承为集合设置的读关注。要了解有关读关注的更多信息,请参阅服务器手册中的读关注

类型: ReadConcern
skip
返回结果时要跳过的文档数。

类型: u64
默认: None
sort
返回结果时使用的排序。默认情况下,驱动程序按文档的自然顺序或在数据库中显示的顺序返回文档。要了解更多信息,请参阅服务器手册术语表中的自然顺序

类型: Document
默认: None

注意

实例化选项

Rust 驱动程序实现了 Builder 设计模式,用于创建许多不同类型,例如FindOneOptionsFindOptions 。 您可以使用每种类型的builder()方法,通过逐个链接选项构建器函数来构造选项实例。

有关可以为每种类型指定的设置的完整列表,请参阅 FindOptions 的 API 文档 和 FindOneOptions。

以下部分包含使用find()findOne()方法检索与过滤条件匹配的样本文档的示例。

此示例演示如何使用以下参数调用find()方法:

  • 查询筛选器,用于匹配unit_price值小于12.00category值不为"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()方法:

  • 查询筛选器,用于匹配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
对结果进行排序时使用的排序规则。要了解有关排序规则的更多信息,请参阅排序规则指南。

类型: Collation
默认: None
hint
用于操作的索引。要了解有关索引的更多信息,请参阅服务器手册中的索引

类型: Hint
默认: None
read_concern
用于查找操作的读关注。如果不设置此选项,该操作将继承为集合设置的读关注。要了解有关读关注的更多信息,请参阅服务器手册中的读关注

类型: ReadConcern
write_concern
该操作的写关注。 如果不设置此选项,该操作将继承为集合设置的写关注。 要了解有关写关注的更多信息,请参阅 MongoDB Server手册中的 写关注 。

类型: WriteConcern

有关设置的完整列表,请参阅 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 文档:

← 读取操作