指定查询
Overview
在本指南中,您可以学习如何指定查询以匹配文档的子集。
要匹配文档子集,请指定包含匹配条件的查询筛选器。匹配条件由您希望文档匹配的字段和值组成。查询筛选器至少包含一组匹配条件,用于确定要返回哪些文档。 如果在查找操作中使用空查询筛选器,驱动程序将匹配集合中的所有文档。
在查询过滤中,您可以将字段与字面值或查询运算符进行匹配。 查询运算符允许您执行数学或逻辑运算来查找集合中的文档。
要使用字面值匹配文档,请使用以下格式:
let filter = doc! { "<field>": "<value>" };
要创建包含查询操作符的匹配条件,请使用以下格式:
let filter = doc! { "<field>": doc! { "<operator>": "<value>" } };
以下部分中的示例展示了如何使用 find()
方法指定查询以匹配collection中的文档。
本指南包括以下部分:
样本数据
本指南中的示例使用以下样本文档。 每个文档代表商店库存中的一种水果,并包含有关其数量的信息。 某些文档包含描述水果或其供应商的字段。
struct Fruit { _id: String, name: String, quantity: i32, description: Option<String>, 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"]) }
逻辑
逻辑操作符需要至少两个匹配条件,并且可以匹配满足部分、全部或不满足这些条件的文档。 例如,您可以使用逻辑操作符$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
查询中返回None
的description
值。
有关更多信息,请参阅serialize_with Serde 属性。
求值
评估操作符分析单个字段或集合的文档,以确定它们是否满足特定条件。 每个评估操作符执行不同的功能。 例如, $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 }
有关评估操作符的完整列表,请参阅服务器手册中的评估查询操作符。
Bitwise
按位操作符将数值字段从以 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 }
阵列
数组操作符检查数组值字段中元素的值或数量。
例子
以下示例匹配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 文档
要了解有关本指南中使用的方法和类型的更多信息,请参阅以下 API 文档: