Docs 菜单
Docs 主页
/
Atlas
/ /

使用 MongoDB 视图转换文档并过滤 Atlas Search 的集合

在此页面上

  • 要求
  • 限制
  • 示例:过滤文档
  • 示例:添加或修改字段
  • 编辑视图
  • 返回视图的管道
  • 故障排除
  • 索引流程
  • 了解详情

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

注意

将 MongoDB 视图与 Atlas Search 结合使用是一项预览功能。预览期间,功能和相应的文档可能随时更改。

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

注意

消歧

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

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

您必须使用:

  • MongoDB 8.0 或更高版本。

在预览期间,您必须使用:

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

  • Atlas Search 仅支持在以下阶段 $expr 的视图:

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

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

  • Atlas Search 查询返回源集合中显示的原始文档。

要创建视图,您必须拥有 createCollection 权限。

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

1

要了解更多信息,请参阅通过 mongosh 进行连接

2
use sample_mflix
3
db.createView(
"movies_ReleasedAfter2000",
"movies",
[
{
$match: {
$expr: {
$gt: [
"$released",
ISODate("2000-01-01")
]
}
}
}
]
)
4

警告

导航改进正在进行中

我们目前正在推出改进的全新导航体验。如果以下步骤与Atlas用户界面中的视图不匹配,请参阅预览文档。

  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未出现,请单击侧边栏中的 Clusters(集群)。

    会显示集群页面。

5

您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。

  1. 在侧边栏中,单击 Services 标题下的 Atlas Search

    如果没有集群,则请单击 Create cluster 来创建一个。要了解更多信息,请参阅创建集群

  2. 如果您的项目有多个集群,请从 Select cluster 下拉列表中选择要使用的集群,然后单击 Go to Atlas Search

    将显示 Atlas Search 页面。

  1. 单击集群的对应 Browse Collections 按钮。

  2. 展开数据库并选择集合。

  3. 单击该集合的 Search Indexes 标签页。

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

6
7

在页面上进行以下选择,然后单击 Next

Search Type

选择 Atlas Search 索引类型。

Index Name and Data Source

指定以下信息:

  • Index Name: releasedAfter2000Index

  • Database and Collection:

    • sample_mflix

    • movies_ReleasedAfter2000

Configuration Method

For a guided experience, select Visual Editor.

To edit the raw index definition, select JSON Editor.

注意

Atlas Search索引默认名为default 。如果保留此名称,则该索引将成为任何未在运算符中指定其他 选项的Atlasindex Search查询的默认搜索索引。如果您要创建多个索引,我们建议您在所有索引之间保持一致的描述性命名约定。

8

Atlas 会显示一个 Toast(简短的非交互式通知),以通知索引正在构建中。

9

新创建的索引会出现在 Atlas Search 标签页上。在构建索引期间,Status 字段显示为 Build in Progress。索引构建完成后,Status 字段将显示为Active

注意

较大的集合需要较长的索引时间。索引构建完成后,您将收到电子邮件通知。

10

注意

以下示例通过对源集合 movies 运行 .aggregate 命令来查询 releasedAfter2000Index 索引。在预览期间,您必须使用视图的源集合 (movies) 来查询在视图上创建的搜索索引。如果您查询视图(movies_ReleasedAfter2000),Atlas Search 不会返回任何结果。

use sample_mflix
1db.movies.aggregate([
2 {
3 $search: {
4 index: "releasedAfter2000Index",
5 text: {
6 path: "title",
7 query: "foo"
8 },
9 sort: {
10 released: 1
11 }
12 }
13 }
14])
[
{
_id: ObjectId('573a13d2f29313caabd929f8'),
plot: "Rising from the ashes of Nirvana, the Foo Fighters became a Grammy-winning sensation on their own. Sixteen years of the band's history comes to life in this documentary, from their demo ...",
genres: [ 'Documentary', 'Music' ],
runtime: 150,
cast: [
'Shawn Cloninger',
'William Goldsmith',
'Jessy Greene',
'Dave Grohl'
],
num_mflix_comments: 0,
poster: 'https://m.media-amazon.com/images/M/MV5BMzE4OTczMTgxM15BMl5BanBnXkFtZTcwNTU1NjQxOA@@._V1_SY1000_SX677_AL_.jpg',
title: 'Foo Fighters: Back and Forth',
fullplot: `Rising from the ashes of Nirvana, the Foo Fighters became a Grammy-winning sensation on their own. Sixteen years of the band's history comes to life in this documentary, from their demo tapes through the creation of their 2011 album, "Wasting Light."`,
languages: [ 'English' ],
released: ISODate('2011-04-05T00:00:00.000Z'),
directors: [ 'James Moll' ],
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
lastupdated: '2015-08-19 00:00:25.937000000',
year: 2011,
imdb: { rating: 8.4, votes: 3745, id: 1853563 },
countries: [ 'USA' ],
type: 'movie',
tomatoes: {
viewer: { rating: 4.4, numReviews: 857, meter: 96 },
dvd: ISODate('2011-08-08T00:00:00.000Z'),
website: 'http://us.foofightersfilm.com/',
production: 'Cinedigm Digital Cinema',
lastUpdated: ISODate('2015-09-12T18:42:01.000Z')
}
}
]

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

1

要了解更多信息,请参阅通过 mongosh 进行连接

2
use sample_airbnb
3
db.createView(
"listingsAndReviews_totalPrice",
"listingsAndReviews",
[
{
$addFields: {
totalPrice: {
$add: [
{
$ifNull: [{ $toDouble: "$price" }, 0]
},
{
$ifNull: [{ $toDouble: "$cleaning_fee" }, 0]
}
]
}
}
}
]
)
4

警告

导航改进正在进行中

我们目前正在推出改进的全新导航体验。如果以下步骤与Atlas用户界面中的视图不匹配,请参阅预览文档。

  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未出现,请单击侧边栏中的 Clusters(集群)。

    会显示集群页面。

5

您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。

  1. 在侧边栏中,单击 Services 标题下的 Atlas Search

    如果没有集群,则请单击 Create cluster 来创建一个。要了解更多信息,请参阅创建集群

  2. 如果您的项目有多个集群,请从 Select cluster 下拉列表中选择要使用的集群,然后单击 Go to Atlas Search

    将显示 Atlas Search 页面。

  1. 单击集群的对应 Browse Collections 按钮。

  2. 展开数据库并选择集合。

  3. 单击该集合的 Search Indexes 标签页。

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

6
7

在页面上进行以下选择,然后单击 Next

Search Type

选择 Atlas Search 索引类型。

Index Name and Data Source

指定以下信息:

  • Index Name: totalPriceIndex

  • Database and Collection:

    • sample_airbnb

    • listingsAndReviews_totalPrice

Configuration Method

For a guided experience, select Visual Editor.

To edit the raw index definition, select JSON Editor.

注意

Atlas Search索引默认名为default 。如果保留此名称,则该索引将成为任何未在运算符中指定其他 选项的Atlasindex Search查询的默认搜索索引。如果您要创建多个索引,我们建议您在所有索引之间保持一致的描述性命名约定。

8
  1. 请指定以下索引定义:

    {
    "mappings": {
    "dynamic": true
    },
    "storedSource": {
    "include": [
    "totalPrice"
    ]
    }
    }
  2. 单击 Next(连接)。

9

Atlas 会显示一个 Toast(简短的非交互式通知),以通知索引正在构建中。

10

新创建的索引会出现在 Atlas Search 标签页上。在构建索引期间,Status 字段显示为 Build in Progress。索引构建完成后,Status 字段将显示为Active

注意

较大的集合需要较长的索引时间。索引构建完成后,您将收到电子邮件通知。

11

注意

以下示例通过对源集合 listingsAndReviews 运行 .aggregate 命令来查询 totalPriceIndex 索引。在预览期间,您必须使用视图的源集合 (listingsAndReviews) 来查询在视图上创建的搜索索引。如果您查询视图(listingsAndReviews_totalPrice),Atlas Search 不会返回任何结果。

use sample_airbnb
1db.listingsAndReviews.aggregate([
2 {
3 $search: {
4 index: "totalPriceIndex",
5 range: {
6 path: "totalPrice",
7 lte: 300
8 },
9 returnStoredSource: true
10 }
11 }
12])
[
{ _id: '10006546', totalPrice: 115 },
{ _id: '1001265', totalPrice: 215 },
{ _id: '10021707', totalPrice: 40 },
{ _id: '1003530', totalPrice: 270 },
{ _id: '10038496', totalPrice: 269 },
{ _id: '10051164', totalPrice: 250 },
{ _id: '10057447', totalPrice: 50 },
{ _id: '10057826', totalPrice: 205 },
{ _id: '10059244', totalPrice: 43 },
{ _id: '10066928', totalPrice: 140 },
{ _id: '10082422', totalPrice: 60 },
{ _id: '10083468', totalPrice: 40 },
{ _id: '10084023', totalPrice: 231 },
{ _id: '10091713', totalPrice: 231 },
{ _id: '10092679', totalPrice: 58 },
{ _id: '10096773', totalPrice: 205 },
{ _id: '10112159', totalPrice: 90 },
{ _id: '10117617', totalPrice: 55 },
{ _id: '10120414', totalPrice: 150 },
{ _id: '10133554', totalPrice: 121 }
]

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

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

运行此命令后,Atlas Search 会自动检测到 View 定义的更改,并在不中断服务的情况下执行重新索引。

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

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

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

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

  • 您编辑视图的方式不符合 Atlas Search 兼容性要求。

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

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

    注意

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

索引在以下情况下会停滞:

警告

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

  • 如果视图定义在索引为 READY 时导致聚合失败,则索引将变为 STALE。在您解析文档或更改视图定义后,索引将返回到 READY,以确保不再失败。不过,在复制自动从 oplog. 删除之前,索引是可以查询的。

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

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

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

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

  2. 监控文档当前状态的变更流,以及已定义 Atlas Search 索引的集合索引。

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

当您在视图上创建 Atlas Search 索引时,视图定义将在步骤 1 和 2 期间应用,转换后的文档将存储在磁盘上的 Atlas Search 索引中。

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

要在视图上创建 Atlas Vector Search 索引,请参阅使用 MongoDB 视图为 Atlas Vector Search 转换文档和过滤集合。

后退

returnStoredSource