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

指定查询

在此页面上

  • Overview
  • 样本数据
  • 字面值
  • 对比
  • 逻辑
  • 元素
  • 求值
  • Bitwise
  • 阵列
  • 更多信息

在本指南中,您可以学习如何指定查询以匹配文档的子集。

要匹配文档子集,请指定包含匹配条件查询筛选器。匹配条件由您希望文档匹配的字段和值组成。查询筛选器至少包含一组匹配条件,用于确定要返回哪些文档。 如果在查找操作中使用空查询筛选器,驱动程序将匹配集合中的所有文档。

在查询过滤中,您可以将字段与字面值或查询运算符进行匹配。 查询运算符允许您执行数学或逻辑运算来查找集合中的文档。

要使用字面值匹配文档,请使用以下格式:

let filter = doc! { "<field>": "<value>" };

要创建包含查询操作符的匹配条件,请使用以下格式:

let filter = doc! { "<field>": doc! { "<operator>": "<value>" } };

以下部分中的示例展示了如何使用 find()方法指定查询以匹配collection中的文档。

本指南包括以下部分:

  • 示例使用的样本数据介绍了查询示例使用的样本数据

  • 字面值描述如何查询与您在查询筛选器中提供的完全匹配的数据

  • 比较描述了如何根据与集合中的值的比较来查询数据

  • 逻辑描述了如何使用应用于字段级操作符结果的逻辑来查询数据

  • 元素描述如何根据字段的存在、不存在或类型进行查询

  • 评估描述了在查询集合中的文档时如何执行更高级别的逻辑,例如正则表达式和文本搜索

  • 按位描述了如何根据基10值的等效位集进行查询

  • 数组描述了如何根据数组值字段中的数据查询集合

  • 附加信息提供了本指南中提到的类型和方法的资源和 API 文档链接

本指南中的示例使用以下样本文档。 每个文档代表商店库存中的一种水果,并包含有关其数量的信息。 某些文档包含描述水果或其供应商的字段。

#[derive(Serialize, Deserialize, Debug)]
struct Fruit {
_id: String,
name: String,
quantity: i32,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
vendors: Option<Vec<String>>
}

以下部分中的示例查询由Fruit结构体描述的collection文档:

let docs = vec! [
Fruit {
_id: 1.to_string(),
name: "orange".to_string(),
quantity: 7,
description: None,
vendors: None
},
Fruit {
_id: 2.to_string(),
name: "apple".to_string(),
quantity: 4,
description: Some("Granny Smith".to_string()),
vendors: None
},
Fruit {
_id: 3.to_string(),
name: "banana".to_string(),
quantity: 36,
description: None,
vendors: None
},
Fruit {
_id: 4.to_string(),
name: "pear".to_string(),
quantity: 28,
description: None,
vendors: vec!["A".to_string(), "C".to_string() ].into()
},
];

要学习;了解如何将此数据插入集合,请参阅 插入文档指南。

字面值查询筛选器允许您查询与您在查询筛选器中提供的值完全匹配的数据。 以下操作使用字面量查询来搜索包含名为name且值为"pear"的字段的文档:

let query = doc! { "name": "pear" };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

注意

字面值查询的功能与使用$eq比较操作符的查询相同。例如,以下查询是等效的:

my_coll.find(doc! {
"price": doc! { "$eq": 5 }
}).await?;
my_coll.find(doc! {
"price": 5
}).await?;

比较操作符允许您通过将文档与查询筛选器中的值进行比较来查询文档。 常见的比较操作符包括用于“大于”比较的$gt 、用于“小于”比较的$lt以及用于“不等于”比较的$ne

以下操作使用比较操作符$gt来匹配quantity值大于5的文档:

// $gt means "greater than"
let query = doc! { "quantity": doc! { "$gt": 5 } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None }
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

有关比较操作符的更多信息,请参阅 MongoDB Server手册中的 比较查询操作符 。

逻辑操作符需要至少两个匹配条件,并且可以匹配满足部分、全部或不满足这些条件的文档。 例如,您可以使用逻辑操作符$or来查询与$gt (大于)比较操作符或字面值查询匹配的文档。

以下操作使用逻辑操作符$and来匹配quantity值大于10且可被3整除的文档:

let query =
doc! { "$and": [
doc! { "quantity": doc! { "$gt": 10 } },
doc! { "quantity": doc! { "$mod": [ 3, 0 ] } }
]
};
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }

注意

如果查询筛选器包含具有多个字段值对的字面值查询,则驱动程序会匹配满足所有条件的文档。

例如,以下查询会生成等效结果:

my_coll.find(doc! {
"price": doc! { "$eq": 5 },
"quantity": doc! { "$gt": 4 }
});
my_coll.find(doc! {
"$and": [
doc! { "price": { "$eq": 5 }},
doc! { "quantity": { "$gt": 4 }}
]
});

有关逻辑操作符的完整列表,请参阅服务器手册中的逻辑查询操作符

元素操作符允许您根据指定字段的类型或文档是否包含指定字段来匹配文档。

以下操作使用元素操作符$exists搜索包含description字段的文档:

let query = doc! { "description": doc! { "$exists": true } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "2", name: "apple", quantity: 4, description: Some("Granny Smith"),
vendors: None }

注意

本指南中描述文档的“Fruit”结构体在其两个字段上使用#[serde(skip_serializing_if = "Option::is_none")]属性。 该属性指定,如果值为None ,则忽略该字段。 这可以防止在$exists查询中返回Nonedescription值。

有关更多信息,请参阅serialize_with Serde 属性。

有关元素操作符的完整列表,请参阅 MongoDB Server手册中的 元素查询操作符 。

评估操作符分析单个字段或集合的文档,以确定它们是否满足特定条件。 每个评估操作符执行不同的功能。 例如, $mod操作符对字段值执行数学运算,而$where操作符允许您根据 JavaScript 表达式计算值。

以下操作使用评估运算符$mod搜索quantity值可被 3 整除的文档:

// $mod means "modulo" and checks if the remainder is a specific value
let query = doc! { "quantity": doc! { "$mod": [ 3, 0 ] } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }

有关评估操作符的完整列表,请参阅服务器手册中的评估查询操作符

按位操作符将数值字段从以 10 为基数(十进制)的数字转换为以 2 为基数(二进制)的数字。它们检查文档中的值是否具有与匹配条件中的值相同的位设置。

以下示例匹配quantity具有与7相同位设置的文档,这相当于二进制中的00000111

let query = doc! { "quantity": doc! { "$bitsAllSet": 7 } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None }

有关按位运算符的完整列表,请参阅 MongoDB Server手册中的 按位查询运算符 。

数组操作符检查数组值字段中元素的值或数量。

以下示例匹配vendor数组字段包含"C"的文档:

let query = doc! { "vendors": doc! { "$elemMatch": { "$eq": "C" } } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

有关按位运算符的完整列表,请参阅服务器手册中的数组查询运算符

要了解有关查找操作的更多信息,请参阅检索数据指南。

要了解有关查询运算符的更多信息,请参阅 MongoDB Server手册中的 查询选择器 。

要了解有关本指南中使用的方法和类型的更多信息,请参阅以下 API 文档:

后退

Retrieve Data