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

将视图与MongoDB Search 结合使用

您可以在视图上创建 MongoDB Search 索引,以转换文档和集合,从而能够部分索引集合、支持不兼容的数据类型或数据模型等。

The following examples use the sample_mflix and sample_airbnb sample databases.

注意

消歧

本页讨论标准视图。要了解按需物化视图,请参阅按需物化视图。

要了解视图类型之间的差异,请参阅与按需物化视图的比较。

您必须使用 MongoDB 8.0 或更高版本。

To edit a View, you must have a User Admin role and use the collMod database command.

  • MongoDB Search 支持具有以下阶段的视图:

    You can use the $expr operator only within the $match stage.

  • 索引名称在源集合及其所有视图中必须是唯一的。

  • MongoDB Search doesn't support view definitions with operators that produce dynamic results, such as the $$USER_ROLES system variable and the $rand aggregation operator.

  • MongoDB Search 查询会返回源集合中出现的原始文档。

  • 要检索已转换的文档,请使用 storedSource 选项。

To create a View, your role must have the createCollection privilege.

以下示例展示了如何创建视图、创建部分索引以及运行使用索引的查询。这些示例通过对源集合或视图运行 .aggregate 命令来查询索引。MongoDB Search 仅在 MongoDB v8.1 或更高版本上直接支持对视图的查询。

筛选文档以部分索引集合。

您可以使用过滤器筛选文档以对集合进行部分索引。以下示例在 sample_mflix.movies 集合上创建一个视图,以便您可以仅搜索在 2000 年 1 月 1 日之后发行的电影。

使用视图添加或修改字段。

以下示例允许您根据新的 totalPrice 字段(该字段是 pricecleaningFee 字段的总和)在 sample_airbnb.listingsAndReviews 集合中搜索住宿。此外,由于 MongoDB Search 不支持 Decimal128 类型,因此需要将值转换为 Double

使用正则表达式为具有命名模式的字段配置动态索引。

To index fields matching a naming pattern, use a View to transform your data so that the fields to index are nested in a sub-document. This enables you to use dynamic mappings for the sub-document path so that you can automatically search all new fields with the suffix _type, without any changes to your index definition.

The following View named listings_SearchableTypes only matches field names that end with _type in the sample_airbnb.listingsAndReviews collection. Specifically, the $set stage adds a new field named searchable_types, which contains the filtered fields with the term _type in the field name. The $arrayToObject contains the filter input (entire document) and condition (regex match for _type).

在这些字段类型上,将不支持的字段类型转换为 string 到分面。

要对不受支持的字段类型进行分面操作,例如 booleanobjectIdUUID,我们建议将这些值转换为 string 类型。

以下示例在 sample_airbnb.listingsAndReviews 命名空间上创建一个视图,以便您可以在 boolean 类型的 host.host_is_superhost 字段以及 objectID 类型的 _id 字段上进行分面

将 decimal128 类型转换为 double 类型。

对于 Decimal128 类型字段的搜索,我们建议将这些值转换为 double 类型。

以下示例在sample_airbnb.listingsAndReviews命名空间上创建一个视图,添加一个名为totalPrice的字段,该字段包含将price字段和cleaning_fee字段的值转换为double后的总和。

以下示例更新了 2000 年之前电影的 movies_ReleasedAfter2000 MongoDB 视图。

db.runCommand(
{
collMod: "movies_ReleasedAfter2000",
viewOn: "movies",
"pipeline": [
{
$match: {
$expr: {
$lt: [
"$released",
ISODate("2000-01-01T00")
]
}
}
}
]
}
)

运行此命令后,MongoDB Search 会自动检测视图定义中的更改,并执行重新索引,而不会造成停机。

以下示例返回 movies_ReleasedAfter2000 视图中的管道。

db.getCollectionInfos({ name: "movies_ReleasedAfter2000" })[0].options.pipeline
[
{
'$match': {
'$expr': { '$gt': [ '$released', ISODate('2000-01-01T00:00:00.000Z') ] }
}
}
]

Highly complex view transformations can increase indexing and query time. This is because the mongod must read the view definition when it filters and transforms the oplog entries during indexing (initial sync and steady state replication), and when it applies those transformations to the returned documents at query-time.

请考虑创建物化视图以避免Atlas上的额外的复制负载。您还可以直接查询源集合,以避免视图转换造成的查询延迟。

在以下场景中,索引会更改为 FAILED 状态:

  • 您在与MongoDB搜索不兼容的视图上创建的索引。

  • 您编辑视图的方式不符合MongoDB搜索兼容性要求。

  • 您删除或更改视图的源集合。

    例如,如果一个视图是在另一个视图上创建的,并且将父视图源更改为另一个集合。

    注意

    如果一个视图是其他视图的后代,这一限制也同样适用。例如,您无法更改或移除所有后代所源自的源集合。

在以下场景中,索引会更改为 STALE 状态:

警告

如果在视图中定义的聚合管道与集合中的文档不兼容,搜索复制将失败。例如,如果 $toDouble 表达式对包含数组的文档字段进行操作,复制将失败。确保您的视图在处理集合中的所有文档时不会出错。

  • 如果视图定义导致聚合失败,而索引为 READY,则索引变为 STALE。解析文档或更改视图定义以使其不再失败后,索引将返回到 READY。当为 STALE 时,索引仍然可查询。如果索引脱离oplog,则会触发索引重建。

  • 如果视图定义在索引为 BUILDING 时导致聚合管道失败,则在修复文档之前,则索引生成将停滞。在您解析文档或更改视图定义后,索引将返回到 READY,以确保不再失败。

您可以在 Atlas 用户界面的索引状态详情页面查看索引状态。

当您使用 8.1 之前的MongoDB版本查询视图时,会出现此错误。

  • 如果您使用 8.0 之前的MongoDB版本,我们建议您升级到 8.1+ 以直接查询视图。您可以升级到 8.0 来查询源集合。

  • 如果使用MongoDB 8.0,则必须针对源集合查询视图索引。示例,对集合而不是视图运行.aggregate()

当您在视图上创建MongoDB搜索索引时,mongot进程执行的任务与您在常规集合上创建MongoDB搜索索引时相同。mongot进程:

  1. 根据集合索引定义中的规则创建MongoDB Search 索引。

  2. 监控变更流以了解您定义了MongoDB Search 索引的集合的文档和索引的当前状态。

  3. 处理MongoDB搜索查询,并将匹配文档的文档ID 和其他搜索元数据返回给 mongod,后者执行完整文档查找并将结果返回给客户端。

当您在视图上创建MongoDB搜索索引时,会在步骤 1 和 2 期间应用视图定义,并且转换后的文档会根据搜索索引定义进行索引,然后存储在磁盘上。

要了解有关视图的更多信息,请参阅视图。

To create a MongoDB Vector Search index on a View, see Use Views with MongoDB Vector Search.