对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

运行MongoDB搜索查询

在本指南中,您可以学习;了解如何使用Scala驾驶员对集合运行MongoDB搜索查询。 MongoDB Search 使您能够对集合执行全文搜索。 MongoDB Search 索引指定搜索行为和要索引的字段。

要学习;了解如何使用Scala驾驶员创建和管理MongoDB搜索索引,请参阅MongoDB搜索和MongoDB Vector Search 索引指南。

本指南中的示例使用Atlas示例数据集sample_mflix数据库中的 movies集合。要学习如何创建免费的MongoDB Atlas 集群并加载示例数据集,请参阅Atlas入门。

注意

MongoDB Search 可在以下部署中使用:

  • MongoDB Atlas v4.2 或更高版本

  • MongoDB Community Edition v8.2 或更高版本

您的集合必须具有MongoDB搜索索引才能运行MongoDB搜索查询。要学习;了解如何创建MongoDB搜索索引,请参阅MongoDB搜索和MongoDB Vector Search 索引指南。

要执行全文搜索,请使用 $search管道阶段调用 aggregate() 方法。 Scala驾驶员提供了 Aggregates.search() 辅助方法来创建此阶段。 search() 方法需要以下参数:

  • SearchOperator 实例,用于指定要搜索的字段和文本

  • SearchOptions 实例,用于指定用于自定义搜索的选项,包括要使用的MongoDB搜索索引的名称

以下示例在 title字段中搜索文本 "Alabama",并仅投影默认包含的 _id字段以及匹配文档的 title字段:

val operator = SearchOperator.text(
SearchPath.fieldPath("title"), "Alabama")
val options = searchOptions().index("<search index name>")
val pipeline = Seq(
Aggregates.search(operator, options),
Aggregates.project(Projections.include("title"))
)
try {
Await
.result(collection.aggregate(pipeline).toFuture(), 20.seconds)
.foreach((doc: Document) => println(doc.toJson()))
} catch {
case e: Throwable => println(s"There was an error: $e")
}
{"_id": {"$oid": "..."}, "title": "Alabama Moon"}
{"_id": {"$oid": "..."}, "title": "Crazy in Alabama"}
{"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}

提示

要查看Atlas文档中的MongoDB Search 教程,请参阅运行Atlas Search查询。

注意

MongoDB Search元数据可用于以下部署:

  • MongoDB Atlas v4.4.11 或更高版本

  • MongoDB Community Edition v8.2 或更高版本

使用 Aggregates.searchMeta() 辅助方法,仅从MongoDB搜索查询中检索元数据,而不返回搜索结果。以下示例返回一个查询的元数据,该查询在 year字段中搜索 2010 附近的值:

try {
Await
.result(
collection.aggregate(Seq(
Aggregates.searchMeta(
SearchOperator.near(2010, 1, SearchPath.fieldPath("year")))
)).toFuture(),
20.seconds
)
.foreach((doc: Document) => println(doc.toJson()))
} catch {
case e: Throwable => println(s"There was an error: $e")
}
{"count": {"lowerBound": 35}}

Scala驱动程序为以下操作符提供了辅助方法:

Operator
说明

从不完整输入字符串中搜索包含字符序列的单词或短语。

将两个或多个操作符组合到一个查询中。

检查字段是否与您指定的值匹配。映射到 equals()equalsNull() 方法。

测试指定索引字段名称的路径在文档中是否存在。

在给定路径搜索由BSON数字、日期、布尔值、ObjectId、uuid 或字符串值组成的大量,并返回该字段的值等于指定大量中任意值的文档。

返回与输入文档类似的文档。

支持对数字、日期和GeoJSON point值进行查询和评分。

使用索引配置中指定的分析器搜索包含有序术语序列的文档。

支持查询索引字段和值的组合。

支持对数字、日期和字符串值进行查询和评分。 映射到 numberRange()dateRange() 方法。

将查询字段解释为正则表达式。

使用在索引配置中指定的分析器执行全文搜索。

启用在搜索字符串中使用可匹配任何字符的特殊字符的查询。

在运行此示例之前,您必须在具有以下定义的 movies 集合上创建 MongoDB 搜索索引:

{
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "lucene.keyword",
"type": "string"
},
"genres": {
"normalizer": "lowercase",
"type": "token"
}
}
}
}

要学习;了解有关创建MongoDB搜索索引的更多信息,请参阅MongoDB搜索和MongoDB Vector Search 索引指南。

以下代码创建具有以下规范的 $search 阶段:

  • 检查 genres大量是否包含 "Comedy"

  • fullplot 字段中搜索字段"new york"

  • 匹配介于 19502000(含)之间的 year

  • 搜索以术语"Love" 开头的 title

val searchStage = Aggregates.search(
SearchOperator.compound()
.must(
Iterable(
SearchOperator.in(fieldPath("genres"), List("Comedy")),
SearchOperator.phrase(fieldPath("fullplot"), "new york"),
SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000),
SearchOperator.wildcard("Love *", fieldPath("title")),
).asJava
)
)
val projectStage = Aggregates.project(
Projections.include("title", "year", "genres"))
try {
Await
.result(
collection.aggregate(Seq(searchStage, projectStage)).toFuture(),
20.seconds
)
.foreach((doc: Document) => println(doc.toJson()))
} catch {
case e: Throwable => println(s"There was an error: $e")
}
{"_id": ..., "genres": ["Comedy", "Romance"],
"title": "Love at First Bite", "year": 1979}
{"_id": ..., "genres": ["Comedy", "Drama"],
"title": "Love Affair", "year": 1994}

要学习有关MongoDB 搜索辅助程序方法的更多信息,请参阅驱动程序 Core API 文档中的SearchOperator接口参考。

有关MongoDB Search 的更多信息,请参阅Atlas文档中的MongoDB Search 概述。

要进一步了解本指南所讨论的方法和类型,请参阅以下 API 文档: