Overview
在本指南中,您可以学习如何使用 Scala 驱动程序指定查询。
您可以通过创建查询过滤来优化查询返回的文档设立。查询过滤是一个表达式,用于指定MongoDB在读取或写入操作中用于匹配文档的搜索条件。
您可以使用查询操作符在查询筛选条件中表达更复杂的匹配条件。Scala驱动程序包含一个 Filters 类,该类为应用查询操作符提供辅助工具方法。
提示
要查看 Filters 辅助方法的完整列表,请参阅 筛选器 API文档。
样本数据
本指南中的示例对fruits集合运行操作,该集合包含表示水果的文档。 以下代码示例展示了如何创建数据库和集合,然后将示例文档插入集合:
val uri: String = "<connection string>" val client: MongoClient = MongoClient(uri) val database: MongoDatabase = client.getDatabase("db") val collection: MongoCollection[Document] = database.getCollection("fruits") // Inserts documents representing fruits val fruits: Seq[Document] = Seq( Document("_id" -> 1, "name" -> "apples", "qty" -> 5, "rating" -> 3, "color" -> "red", "type" -> Seq("fuji", "honeycrisp")), Document("_id" -> 2, "name" -> "bananas", "qty" -> 7, "rating" -> 4, "color" -> "yellow", "type" -> Seq("cavendish")), Document("_id" -> 3, "name" -> "oranges", "qty" -> 6, "rating" -> 2, "type" -> Seq("naval", "mandarin")), Document("_id" -> 4, "name" -> "pineapples", "qty" -> 3, "rating" -> 5, "color" -> "yellow") ) val result = collection.insertMany(fruits) .subscribe((result: InsertManyResult) => println(result))
精确匹配
字面值查询返回与查询过滤完全匹配的文档。
以下示例将查询过滤指定为find()方法的参数。 此代码会返回color字段的值为"yellow"的所有文档:
val filter = equal("color", "yellow") collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"]} {"_id": 4, "name": "pineapples", "qty": 3, "rating": 5, "color": "yellow"}
注意
查找所有文档
要查找集合中的所有文档,请调用 find() 方法而不传递任何参数:
collection.find()
比较操作符。
比较操作符会根据查询过滤中的指定值评估文档字段值。 以下列表定义了常见的比较操作符及其相应的 Filters 辅助方法:
查询运算符 | 助手方法 | 说明 |
|---|---|---|
|
| 匹配其中给定字段的值大于指定值的文档。 |
|
| 匹配给定字段的值小于或等于指定值的文档。 |
|
| 匹配其中给定字段的值不等于指定值的文档。 |
提示
要查看比较操作符的完整列表,请参阅 MongoDB Server 手册中的比较查询操作符指南。
以下示例将查询过滤传递给 find() 方法,并使用 gt() 方法应用$gt操作符。 此代码会返回 rating字段的值大于 2 的所有文档:
val filter = gt("rating", 2) collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"]} {"_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"]} {"_id": 4, "name": "pineapples", "qty": 3, "rating": 5, "color": "yellow"}
逻辑操作符
逻辑操作符通过使用应用于两组或多组表达式结果的逻辑来匹配文档。 下表描述了每个逻辑操作符及其相应的 Filters 辅助方法:
查询运算符 | 助手方法 | 说明 |
|---|---|---|
|
| 匹配满足所有子句条件的文档 |
|
| 匹配满足一个子句条件的文档 |
|
| 匹配不满足任何子句条件的文档 |
|
| 匹配与表达式不匹配的文档 |
提示
要了解有关逻辑操作符的更多信息,请参阅 MongoDB Server 手册中的逻辑查询操作符指南。
以下示例将查询过滤传递给 find() 方法,并使用 or() 方法应用$or 逻辑操作符。 此代码会返回qty 字段值大于5 或 color字段值为"yellow" 的所有文档:
val filter = or(gt("qty", 5), equal("color", "yellow")) collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"]} {"_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"]} {"_id": 4, "name": "pineapples", "qty": 3, "rating": 5, "color": "yellow"}
数组操作符
数组操作符根据大量字段中元素的值或数量来匹配文档。 下表描述了每个大量操作符及其相应的 Filters 辅助方法:
查询运算符 | 助手方法 | 说明 |
|---|---|---|
|
| 匹配具有包含查询中所有元素的数组的文档 |
|
| 如果大量字段中的元素满足查询中的所有条件,则匹配文档 |
|
| 匹配具有指定大小数组的文档 |
提示
要了解有关数组操作符的更多信息,请参阅 MongoDB Server 手册中的数组查询操作符指南。
以下示例将查询过滤传递给 find() 方法,并使用 size() 方法应用$size大量操作符。 此代码会返回 type大量字段包含 2 元素的所有文档:
val filter = size("type", 2) collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"]} {"_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"]}
元素操作符
元素操作符根据字段的存在或类型查询数据。 下表描述了每个元素操作符及其相应的 Filters 辅助方法:
查询运算符 | 助手方法 | 说明 |
|---|---|---|
|
| 匹配具有指定字段的文档 |
|
| 如果字段具有指定类型,则匹配文档 |
提示
要了解有关元素操作符的更多信息,请参阅 MongoDB Server 手册中的元素查询操作符指南。
以下示例将查询过滤传递给 find() 方法,并使用 exists() 方法应用$exists 元素操作符。 此代码会返回具有 color字段的所有文档:
val filter = exists("color") collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"]} {"_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"]} {"_id": 4, "name": "pineapples", "qty": 3, "rating": 5, "color": "yellow"}
评估操作符
评估操作符根据单个字段或整个集合文档的评估返回数据。 下表描述了常见元素操作符及其相应的 Filters 辅助方法:
查询运算符 | 助手方法 | 说明 |
|---|---|---|
|
| 对文档执行文本搜索 |
|
| 匹配具有满足指定正则表达式的值的文档 |
|
| 对字段值执行模运算,并将文档与指定结果进行匹配 |
提示
要查看评估操作符的完整列表,请参阅 MongoDB Server 手册中的评估查询操作符指南。
以下示例将查询过滤传递给 find() 方法,并使用 regex() 方法应用$regex 评估操作符。 此代码使用正则表达式返回 name字段值至少包含两个连续 'p' 字符的所有文档:
val filter = regex("name", "p{2,}") collection.find(filter).subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"]} {"_id": 4, "name": "pineapples", "qty": 3, "rating": 5, "color": "yellow"}
更多信息
要了解有关查询文档的更多信息,请参阅 MongoDB Server 手册中的查询文档指南。
要学习有关使用 Scala 驱动程序检索文档的更多信息,请参阅检索数据指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: