Docs 菜单
Docs 主页
/ /

将视图与MongoDB Search 结合使用

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

以下示例使用了 sample_mflixsample_airbnb 示例数据库。

注意

消歧

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

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

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

要编辑视图,您必须拥有用户管理员角色,并使用 collMod 数据库命令。

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

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

  • MongoDB Search 不支持会生成动态结果的操作符的视图定义,例如$$USER_ROLES系统变量和$rand聚合操作符。

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

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

要创建视图,您的角色必须具有createCollection 权限。

以下示例演示了如何创建视图、对文档进行部分索引以及使用索引对视图运行查询。

以下示例更新了 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') ] }
}
}
]

当Atlas读取视图以过滤和转换源集合时,高度复杂的视图转换可能会导致性能下降。在这种情况下,请考虑创建物化视图以避免对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 期间应用视图定义,并且转换后的文档会根据搜索索引定义进行索引,然后存储在磁盘上。

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

要在视图上创建MongoDB Vector Search索引,请参阅将视图与MongoDB Vector Search结合使用。

后退

多个集合

在此页面上