文档菜单
文档首页
/ / /
Rust 驱动
/ / /

检索数据

本页内容

  • 概述
  • 示例数据
  • 查找操作
  • 查找所有匹配文档
  • 查找单个文档
  • 修改查找行为
  • 示例
  • 聚合操作
  • 聚合文档数据
  • 修改聚合行为
  • 示例
  • 附加信息
  • API文档

本指南将指导您如何使用读取操作从MongoDB集合中检索数据。读取操作是从服务器检索文档的命令。

读取操作有两种类型:

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

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

本指南包括以下部分:

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

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

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

  • 附加信息提供了本指南中提到的类型和方法的相关资源和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()find_one() 方法。

要查找符合您条件的所有文档,请使用 find() 方法。此方法接受一个查询过滤器作为参数。查询过滤器由构成文档匹配条件的字段和值组成。

该方法返回一个 Cursor 类型,您可以迭代它以检索任何符合过滤器条件的文档。

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

要了解有关指定查询的更多信息,请参阅 指定查询指南。

要查找第一个符合您条件的文档,请使用find_one()方法。此方法需要一个查询过滤器作为参数。查询过滤器由用于形成文档匹配条件的字段和值组成。

如果文档符合过滤器条件,该方法返回一个值为SomeResult<Option<T>>类型。如果没有文档符合过滤器条件,find_one()返回一个值为NoneResult<Option<T>>类型。

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

您可以通过将FindOptions选项构建器方法链接到find()来修改find()方法的行为,并通过将FindOneOptions选项构建器方法链接到find_one()来修改find_one()方法的行为。

以下表格描述了您可以调用其对应构建器方法设置的常用FindOptionsFindOneOptions字段

字段
描述
collation
用于排序结果的校对规则。有关校对的更多信息,请参阅校对指南。

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

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

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

类型: ReadConcern
skip
返回结果时跳过的文档数。有关如何使用skip()构建器方法的更多信息,请参阅跳过返回结果

类型: u64
默认值: None
sort
返回结果时使用的排序方式。默认情况下,驱动程序按照文档的自然顺序或数据库中的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的自然顺序。有关如何使用sort()构建器方法的更多信息,请参阅排序结果

类型: Document
默认值: None

注意

设置选项

您可以通过直接将选项构建器方法链接到查找操作方法调用来设置FindOptionsFindOneOptions字段。如果您正在使用驱动程序的早期版本,您必须通过将选项构建器方法链接到builder()方法来构建一个FindOptionsFindOneOptions实例。然后,将您的选项实例作为参数传递给find()find_one()

有关可以为每种类型指定的完整设置列表,请参阅FindOptionsFindOneOptions.

以下部分包含使用find()findOne()方法检索符合过滤条件的示例文档的示例。

此示例执行以下操作

  • 调用 find() 方法

  • 将查询过滤器传递给 find(),以匹配值小于 12.00unit_pricecategory 值不为 "厨房" 的文档

  • 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(),以匹配值小于或等于 20.00unit_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
用于排序结果的校对规则。有关校对的更多信息,请参阅校对指南。

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

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

类型: ReadConcern
write_concern
操作的写关注。如果您不设置此选项,则操作继承为集合设置的写关注。有关写关注的更多信息,请参阅服务器手册中的写关注

类型: WriteConcern

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

返回上一页

读取