Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

如何在 Atlas Search 中使用分面

在此页面上

  • 先决条件
  • 为分面创建 Atlas Search 索引
  • 搜索集合
  • 继续学习

本教程介绍如何使用分面定义sample_mflix.movies 集合中为字符串、日期和数字字段创建索引。教程展示了如何针对这些字段运行 Atlas Search 查询,从而获取按字符串字段值以及按日期和数字字段范围分组的结果(结果包含各组计数)。它将引导您完成以下步骤:

  1. 使用 sample_mflix.movies 集合中的 genresreleasedyear 字段的分面定义设置 Atlas Search 索引。

  2. 针对 sample_mflix.movies 集合中的 released 字段运行 Atlas Search 查询,以获取按 genres 字段的值和year 字段的范围分组的结果。

要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin 或更高的项目访问权限。

要完成这些教程,除了 Atlas Search 教程页面中列出的先决条件外,您还必须有一个运行以下版本之一的 Atlas cluster:

  • MongoDB 5.0.4+

  • MongoDB 6.0+

  • MongoDB 7.0+

在本部分,您将在 sample_mflix.movies 集合中的 genresyearreleased 字段上创建 Atlas Search 索引。

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

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

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

    显示 集群页面。

2

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

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

    注意

    如果您没有集群,请单击 Create cluster 来创建一个。如需了解详情,请参阅 创建集群。

  2. Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search

    将显示 Atlas Search 页面。

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

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

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

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

3
4

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

Search Type

选择 Atlas Search 索引类型。

Index Name and Data Source

指定以下信息:

  • Index Name: facet-tutorial

  • Database and Collection:

    • sample_mflix database

    • movies 集合

Configuration Method

For a guided experience, select Visual Editor.

To edit the raw index definition, select JSON Editor.
5

您可以创建使用动态映射静态映射的 Atlas Search 索引。要了解有关动态和静态映射的更多信息,请参阅静态和动态映射

以下索引定义将genres 字段静态索引为stringFacet 类型,并动态索引 movies集合中每个文档中受支持类型的其他字段。您可以使用Atlas SearchVisual Editor 或Atlas SearchJSON Editor 在Atlas 用户界面中创建索引。

  1. 单击 Next,然后单击 Review Your Index

  2. 单击 Field Mappings 部分下的 Add Field Mapping

  3. 单击 Customzed COnfiguration,然后从下拉列表中选择以下内容:

    Field Name

    genres

    Data Type

    StringFacet

  4. 单击 Add,然后单击 Save Changes

  1. 单击 Next(连接)。

  2. 查看索引定义。

    索引定义应类似于以下内容:

    {
    "mappings": {
    "dynamic": true,
    "fields": {
    "genres": {
    "type": "stringFacet"
    }
    }
    }
    }
  3. 单击 Next(连接)。

6
7

此时将显示一个模态窗口,让您知道索引正在构建中。点击 Close 按钮。

8

构建索引大约需要一分钟时间。在构建时,Status 列显示 Build in Progress。构建完成后,Status 列显示 Active


➤ 使用选择语言下拉菜单设置本节中示例的语言。


您可以在使用 $search$searchMeta 阶段的查询中使用分面。在本节中,连接到您的 Atlas 集群,然后使用$searchMeta$search阶段针对 sample_mflix.movies 集合运行示例查询,将 genreyear 字段分组到桶中。为了优化性能:

  • 如果您只需要facet元数据,请使用$searchMeta阶段。

  • 如果要同时检索查询结果和 facet 元数据,请使用 $search 阶段。

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

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

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

    会显示集群页面。

2

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

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

    注意

    如果您没有集群,请单击 Create cluster 来创建一个。如需了解详情,请参阅 创建集群。

  2. Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search

    将显示 Atlas Search 页面。

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

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

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

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

3

单击要查询的索引右侧的 Query 按钮。

4

单击Edit $search Query查看 JSON格式的默认查询语法示例。

5

要运行查询,请将以下查询复制并粘贴到 Query Editor,然后单击 Search

以下查询搜索在 1921 年 11 月 11 日前后上映的电影。它要求电影相对于 originpivot 距离为大约三个月。它要求提供 genresyear 字段上的元数据。该查询要求计数:

  • genres 字符串数组字段中每种类型的电影数量

  • 1910 年至 1939 年(含)期间的电影数量

[
{
"$searchMeta": {
"index": "facet-tutorial",
"facet": {
"operator": {
"near": {
"path": "released",
"origin": ISODate("1921-11-01T00:00:00.000+00:00"),
"pivot": 7776000000
}
},
"facets": {
"genresFacet": {
"type": "string",
"path": "genres"
},
"yearFacet" : {
"type" : "number",
"path" : "year",
"boundaries" : [1910,1920,1930,1940]
}
}
}
}
}
]
6

Search Tester 可能不会显示结果中字段的所有值。要查看结果中字段的所有值,请展开字段。

Atlas Search 在页面中显示以下结果:

count: Object
lowerBound: 20878
facet: Object
genresFacet: Object
buckets: Array (10)
0: Object
_id: "Drama"
count: 12149
1: Object
_id: "Comedy"
count: 6436
2: Object
_id: "Romance"
count: 3274
3: Object
_id: "Crime"
count: 2429
4: Object
_id: "Thriller"
count: 2400
5: Object
_id: "Action"
count: 2349
6: Object
_id: "Adventure"
count: 1876
7: Object
_id: "Documentary"
count: 1755
8: Object
_id: "Horror"
count: 1432
9: Object
_id: "Biography"
count: 1244
yearFacet: Object
buckets: Array (3)
0: Object
_id: 1910
count: 14
1: Object
_id: 1920
count: 47
2: Object
_id: 1930
count: 238
1

在终端窗口中打开mongosh并连接到集群。 有关连接的详细说明,请参阅通过mongosh连接。

2

mongosh 提示符下运行以下命令:

use sample_mflix
3

示例查询使用以下内容来查询集合:

  • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

  • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

1db.movies.aggregate([
2 {
3 "$searchMeta": {
4 "index": "facet-tutorial",
5 "facet": {
6 "operator": {
7 "near": {
8 "path": "released",
9 "origin": ISODate("1921-11-01T00:00:00.000+00:00"),
10 "pivot": 7776000000
11 }
12 },
13 "facets": {
14 "genresFacet": {
15 "type": "string",
16 "path": "genres"
17 },
18 "yearFacet" : {
19 "type" : "number",
20 "path" : "year",
21 "boundaries" : [1910,1920,1930,1940]
22 }
23 }
24 }
25 }
26 }
27])
[
{
meta: {
count: { lowerBound: Long('20878') },
facet: {
genresFacet: {
buckets: [
{ _id: 'Drama', count: Long('12149') },
{ _id: 'Comedy', count: Long('6436') },
{ _id: 'Romance', count: Long('3274') },
{ _id: 'Crime', count: Long('2429') },
{ _id: 'Thriller', count: Long('2400') },
{ _id: 'Action', count: Long('2349') },
{ _id: 'Adventure', count: Long('1876') },
{ _id: 'Documentary', count: Long('1755') },
{ _id: 'Horror', count: Long('1432') },
{ _id: 'Biography', count: Long('1244') }
]
},
yearFacet: {
buckets: [
{ _id: 1910, count: Long('14') },
{ _id: 1920, count: Long('47') },
{ _id: 1930, count: Long('238') }
]
}
}
}
}
]
db.movies.aggregate([
{
"$search": {
"index": "facet-tutorial",
"facet": {
"operator": {
"near": {
"path": "released",
"origin": ISODate("1921-11-01T00:00:00.000+00:00"),
"pivot": 7776000000
}
},
"facets": {
"genresFacet": {
"type": "string",
"path": "genres"
},
"yearFacet": {
"type": "number",
"path": "year",
"boundaries" : [1910,1920,1930,1940]
}
}
}
}
},
{
"$facet": {
"meta": [
{"$replaceWith": "$$SEARCH_META"},
{"$limit": 1}
]
}
},
{
"$set": {
"meta": {
"$arrayElemAt": ["$meta", 0]
}
}
}
])
[
{
meta: {
count: { lowerBound: Long('20878') },
facet: {
genresFacet: {
buckets: [
{ _id: 'Drama', count: Long('12149') },
{ _id: 'Comedy', count: Long('6436') },
{ _id: 'Romance', count: Long('3274') },
{ _id: 'Crime', count: Long('2429') },
{ _id: 'Thriller', count: Long('2400') },
{ _id: 'Action', count: Long('2349') },
{ _id: 'Adventure', count: Long('1876') },
{ _id: 'Documentary', count: Long('1755') },
{ _id: 'Horror', count: Long('1432') },
{ _id: 'Biography', count: Long('1244') }
]
},
yearFacet: {
buckets: [
{ _id: 1910, count: Long('14') },
{ _id: 1920, count: Long('47') },
{ _id: 1930, count: Long('238') }
]
}
}
}
}
]
1

打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。

2

Database 屏幕上,依次单击 sample_mflix 数据库和 movies 集合。

3

该查询使用以下 searchMeta 操作符子句:

  • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

  • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

若要在 MongoDB Compass 中运行此查询:

  1. 单击 Aggregations 标签页。

  2. 单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    管道阶段
    查询

    $searchMeta

    {
    index: 'facet-tutorial',
    facet: {
    operator: {
    near: {
    path: 'released',
    origin: ISODate("1921-11-01T00:00:00.000+00:00"),
    pivot: 7776000000
    }
    },
    facets: {
    genresFacet: {
    type: 'string',
    path: 'genres'
    },
    yearFacet: {
    type: 'number',
    path: 'year',
    boundaries: [1910,1920,1930,1940]
    }
    }
    }
    }
    管道阶段
    查询

    $search

    {
    "index": "facet-tutorial",
    "facet": {
    "operator": {
    "near": {
    "path": "released",
    "origin": ISODate("1921-11-01T00:00:00.000+00:00"),
    "pivot": 7776000000
    }
    },
    "facets": {
    "genresFacet": {
    "type": "string",
    "path": "genres"
    },
    "yearFacet": {
    "type": "number",
    "path": "year",
    "boundaries" : [1910,1920,1930,1940]
    }
    }
    }
    }

    $facet

    {
    meta: [
    {
    $replaceWith: "$$SEARCH_META"
    },
    {
    $limit: 1
    }
    ]
    }

    $set

    {
    meta: {
    $arrayElemAt: ["$meta", 0]
    }
    }

如果启用了 Auto Preview,MongoDB Compass 将在 $set 管道阶段旁边显示以下文档:

count: Object
lowerBound: 20878
facet: Object
genresFacet: Object
buckets: Array (10)
0: Object
_id: "Drama"
count: 12149
1: Object
_id: "Comedy"
count: 6436
2: Object
_id: "Romance"
count: 3274
3: Object
_id: "Crime"
count: 2429
4: Object
_id: "Thriller"
count: 2400
5: Object
_id: "Action"
count: 2349
6: Object
_id: "Adventure"
count: 1876
7: Object
_id: "Documentary"
count: 1755
8: Object
_id: "Horror"
count: 1432
9: Object
_id: "Biography"
count: 1244
yearFacet: Object
buckets: Array (3)
0: Object
_id: 1910
count: 14
1: Object
_id: 1920
count: 47
2: Object
_id: 1930
count: 238
1
  1. 创建一个名为 facet-query-example 的新目录,并使用 dotnet new 命令初始化项目。

    mkdir facet-query-example
    cd facet-query-example
    dotnet new console
  2. 将 .NET/C# 驱动程序作为依赖项添加到项目中。

    dotnet add package MongoDB.Driver
2
  1. Program.cs文件的内容替换为以下代码。

    示例查询使用以下内容来查询集合:

    • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

    • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class FacetExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // declare data for date and number fields
    23 var originDate = new DateTime(1921, 11, 01, 0, 0, 0, DateTimeKind.Utc);
    24
    25 // define and run pipeline
    26 var results = moviesCollection.Aggregate()
    27 .SearchMeta(Builders<MovieDocument>.Search.Facet(
    28 Builders<MovieDocument>.Search.Near(movie => movie.Released, originDate, 7776000000),
    29 Builders<MovieDocument>.SearchFacet.String("genresFacet", movie => movie.Genres, 10),
    30 Builders<MovieDocument>.SearchFacet.Number("yearFacet", movie => movie.Year, 1910, 1920, 1930, 1940)),
    31 indexName: "facet-tutorial")
    32 .Single();
    33
    34 // print results
    35 Console.WriteLine(results.ToJson());
    36 }
    37}
    38
    39[BsonIgnoreExtraElements]
    40public class MovieDocument
    41{
    42 [BsonIgnoreIfDefault]
    43 public ObjectId Id { get; set; }
    44 public string [] Genres { get; set; }
    45 public DateTime Released { get; set; }
    46 public int Year { get; set; }
    47}
    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6using System;
    7
    8public class FacetExample
    9{
    10 private const string MongoConnectionString = "<your-connection-string>";
    11
    12 public static void Main(string[] args)
    13 {
    14 // Register camelCase conventions for document mapping
    15 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    16 ConventionRegistry.Register("CamelCase", camelCaseConvention, t => true);
    17
    18 // Connect to your MongoDB Atlas cluster
    19 var mongoClient = new MongoClient(MongoConnectionString);
    20 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    21 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    22
    23 // Define the origin date for the `near` operator
    24 var originDate = new DateTime(1921, 11, 01, 0, 0, 0, DateTimeKind.Utc);
    25
    26 // Create an array of BsonValues for the number boundaries
    27 var yearBoundaries = new BsonArray { 1910, 1920, 1930, 1940 };
    28
    29 // Define the $search stage
    30 var searchStage = Builders<MovieDocument>.Search.Facet(
    31 Builders<MovieDocument>.Search.Near(
    32 "released", // The field to search
    33 origin: originDate, // Starting date
    34 pivot: 7776000000 // Pivot (milliseconds)
    35 ),
    36 Builders<MovieDocument>.SearchFacet.String(
    37 "genresFacet", // Name of the string facet
    38 "genres" // The field to facet on
    39 ),
    40 Builders<MovieDocument>.SearchFacet.Number(
    41 "yearFacet", // Name of the number facet
    42 "year", // The field to facet on
    43 yearBoundaries
    44 )
    45 );
    46
    47 // Step 2: Aggregate pipeline implementationdd
    48 var pipeline = moviesCollection.Aggregate()
    49 .Search(searchStage, indexName: "facet-tutorial")
    50 .AppendStage<BsonDocument>(new BsonDocument
    51 {
    52 { "$facet", new BsonDocument
    53 {
    54 { "meta", new BsonArray
    55 {
    56 new BsonDocument { { "$replaceWith", "$$SEARCH_META" } },
    57 new BsonDocument { { "$limit", 1 } }
    58 }
    59 }
    60 }
    61 }
    62 })
    63 .AppendStage<BsonDocument>(new BsonDocument
    64 {
    65 { "$set", new BsonDocument
    66 {
    67 { "meta", new BsonDocument
    68 {
    69 { "$arrayElemAt", new BsonArray { "$meta", 0 } }
    70 }
    71 }
    72 }
    73 }
    74 })
    75 .ToList();
    76
    77 // Step 3: Output results
    78 foreach (var result in pipeline)
    79 {
    80 Console.WriteLine(result.ToJson());
    81 }
    82 }
    83}
    84
    85[BsonIgnoreExtraElements]
    86public class MovieDocument
    87{
    88 [BsonIgnoreIfDefault]
    89 public ObjectId Id { get; set; }
    90 public string[] Genres { get; set; }
    91 public DateTime Released { get; set; }
    92 public int Year { get; set; }
    93}
  2. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

3
dotnet run facet-query-example.csproj
{
"meta" : {
"count" : { "lowerBound" : 20878 },
"facet" : {
"genresFacet" : {
"buckets" : [
{ "_id" : "Drama", "count" : 12149 },
{ "_id" : "Comedy", "count" : 6436 },
{ "_id" : "Romance", "count" : 3274 },
{ "_id" : "Crime", "count" : 2429 },
{ "_id" : "Thriller", "count" : 2400 },
{ "_id" : "Action", "count" : 2349 },
{ "_id" : "Adventure", "count" : 1876 },
{ "_id" : "Documentary", "count" : 1755 },
{ "_id" : "Horror", "count" : 1432 },
{ "_id" : "Biography", "count" : 1244 }
]
},
"yearFacet" : {
"buckets" : [
{ "_id" : 1910, "count" : 14 },
{ "_id" : 1920, "count" : 47 },
{ "_id" : 1930, "count" : 238 }
]
}
}
}
}
1
  1. 创建一个名为 facet-query.go 的文件。

  2. 将以下代码复制并粘贴到 facet-query.go 文件。

    此代码示例将执行以下任务:

    • 导入mongodb包和依赖项。

    • 建立与您的 Atlas 集群的连接。

    • 使用以下 searchMeta 子句来查询集合:

      • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

      • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    • 遍历游标以打印与查询匹配的文档。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/bson"
    9 "go.mongodb.org/mongo-driver/mongo"
    10 "go.mongodb.org/mongo-driver/mongo/options"
    11)
    12
    13func main() {
    14 // connect to your Atlas cluster
    15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
    16 if err != nil {
    17 panic(err)
    18 }
    19 defer client.Disconnect(context.TODO())
    20
    21 // set namespace
    22 collection := client.Database("sample_mflix").Collection("movies")
    23
    24 // define pipeline stages
    25 searchStage := bson.D{{"$searchMeta", bson.M{
    26 "index": "facet-tutorial",
    27 "facet": bson.M{
    28 "operator": bson.M{
    29 "near": bson.M{
    30 "path": "released",
    31 "origin": time.Date(1921, time.November, 1, 0, 0, 0, 0, time.UTC),
    32 "pivot": 7776000000},
    33 },
    34 "facets": bson.M{
    35 "genresFacet": bson.M{
    36 "path": "genres",
    37 "type": "string"},
    38 "yearFacet": bson.M{
    39 "path": "year",
    40 "type": "number",
    41 "boundaries": bson.A{1910, 1920, 1930, 1940}},
    42 }}}}}
    43 // run pipeline
    44 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage})
    45 if err != nil {
    46 panic(err)
    47 }
    48
    49 // print results
    50 var results []bson.D
    51 if err = cursor.All(context.TODO(), &results); err != nil {
    52 panic(err)
    53 }
    54 for _, result := range results {
    55 fmt.Println(result)
    56 }
    57}
    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/bson"
    9 "go.mongodb.org/mongo-driver/mongo"
    10 "go.mongodb.org/mongo-driver/mongo/options"
    11)
    12
    13func main() {
    14 // connect to your Atlas cluster
    15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
    16 if err != nil {
    17 panic(err)
    18 }
    19 defer client.Disconnect(context.TODO())
    20
    21 // set namespace
    22 collection := client.Database("sample_mflix").Collection("movies")
    23
    24 // define pipeline stages
    25 searchStage := bson.D{{"$search", bson.M{
    26 "index": "facet-tutorial",
    27 "facet": bson.M{
    28 "operator": bson.M{
    29 "near": bson.M{
    30 "path": "released",
    31 "origin": time.Date(1921, time.November, 1, 0, 0, 0, 0, time.UTC),
    32 "pivot": 7776000000},
    33 },
    34 "facets": bson.M{
    35 "genresFacet": bson.M{
    36 "path": "genres",
    37 "type": "string"},
    38 "yearFacet": bson.M{
    39 "path": "year",
    40 "type": "number",
    41 "boundaries": bson.A{1910, 1920, 1930, 1940}},
    42 },
    43 },
    44 }}}
    45
    46 facetStage:= bson.D{{"$facet", bson.D{
    47 {"meta", bson.A{
    48 bson.D{{"$replaceWith", "$$SEARCH_META"}},
    49 bson.D{{"$limit", 1}},
    50 }},
    51 }}}
    52 setStage:= bson.D{{"$set", bson.D{
    53 {"meta", bson.D{
    54 {"$arrayElemAt", bson.A{"$meta", 0}},
    55 }},
    56 }}}
    57
    58 // run pipeline
    59 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, facetStage, setStage})
    60 if err != nil {
    61 panic(err)
    62 }
    63
    64 // print results
    65 var results []bson.D
    66 if err = cursor.All(context.TODO(), &results); err != nil {
    67 panic(err)
    68 }
    69 for _, result := range results {
    70 fmt.Println(result)
    71 }
    72}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    go run facet-query.go
    [
    {count [
    {lowerBound 20878}
    ]}
    {facet [
    {genresFacet [
    {buckets [
    [{_id Drama} {count 12149}]
    [{_id Comedy} {count 6436}]
    [{_id Romance} {count 3274}]
    [{_id Crime} {count 2429}]
    [{_id Thriller} {count 2400}]
    [{_id Action} {count 2349}]
    [{_id Adventure} {count 1876}]
    [{_id Documentary} {count 1755}]
    [{_id Horror} {count 1432}]
    [{_id Biography} {count 1244}]
    ]}
    ]}
    {yearFacet [
    {buckets [
    [{_id 1910} {count 14}]
    [{_id 1920} {count 47}]
    [{_id 1930} {count 238}]
    ]}
    ]}
    ]}
    ]
1

junit

4.11 或更高版本

mongodb-driver-sync

4.3.0 或更高版本

slf4j-log4j12

1.7.30 或更高版本

2
  1. 创建一个名为 FacetQuery.java 的文件。

  2. 将以下代码复制并粘贴到 FacetQuery.java 文件。

    此代码示例将执行以下任务:

    • 导入mongodb包和依赖项。

    • 建立与您的 Atlas 集群的连接。

    • 使用以下 searchMeta 子句来查询集合:

      • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

      • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    • 遍历游标以打印与查询匹配的文档。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1import com.mongodb.client.MongoClient;
    2import com.mongodb.client.MongoClients;
    3import com.mongodb.client.MongoCollection;
    4import com.mongodb.client.MongoDatabase;
    5import org.bson.Document;
    6
    7import java.time.Instant;
    8import java.util.Arrays;
    9import java.util.Date;
    10
    11public class FacetQuery {
    12 public static void main(String[] args) {
    13 // connect to your Atlas cluster
    14 String uri = "<connection-string>";
    15
    16 try (MongoClient mongoClient = MongoClients.create(uri)) {
    17 // set namespace
    18 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    19 MongoCollection<Document> collection = database.getCollection("movies");
    20
    21 // define pipeline
    22 Document agg = new Document("$searchMeta",
    23 new Document( "index", "facet-tutorial")
    24 .append("facet",
    25 new Document("operator",
    26 new Document("near",
    27 new Document("path", "released")
    28 .append("origin", Date.from(Instant.parse("1921-11-01T00:00:00.000+00:00")))
    29 .append("pivot", 7776000000L)))
    30 .append("facets",
    31 new Document("genresFacet",
    32 new Document("type", "string").append("path", "genres"))
    33 .append("yearFacet",
    34 new Document("type", "number").append("path", "year")
    35 .append("boundaries", Arrays.asList(1910, 1920, 1930, 1940))
    36 ))));
    37 // run pipeline and print results
    38 collection.aggregate(Arrays.asList(agg))
    39 .forEach(doc -> System.out.println(doc.toJson()));
    40
    41 }
    42 }
    43}
    1import com.mongodb.client.MongoClient;
    2import com.mongodb.client.MongoClients;
    3import com.mongodb.client.MongoCollection;
    4import com.mongodb.client.MongoDatabase;
    5import org.bson.Document;
    6
    7import java.util.Arrays;
    8import java.util.List;
    9
    10public class FacetQuery {
    11 public static void main(String[] args) {
    12 // connect to your Atlas cluster
    13 String uri = "<CONNECTION-STRING>";
    14
    15 try (MongoClient mongoClient = MongoClients.create(uri)) {
    16 // set namespace
    17 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    18 MongoCollection<Document> collection = database.getCollection("movies");
    19
    20 // define pipeline
    21 List<Document> agg = Arrays.asList(new Document("$search",
    22 new Document("index", "facet-tutorial")
    23 .append("facet", new Document("operator", new Document("near", new Document("path", "released")
    24 .append("origin", new java.util.Date(-1520035200000L))
    25 .append("pivot", 7776000000L)))
    26 .append("facets", new Document("genresFacet", new Document("type", "string")
    27 .append("path", "genres"))
    28 .append("yearFacet", new Document("type", "number")
    29 .append("path", "year")
    30 .append("boundaries", Arrays.asList(1910L, 1920L, 1930L, 1940L)))))),
    31 new Document("$facet", new Document("meta", Arrays.asList(new Document("$replaceWith", "$$SEARCH_META"),
    32 new Document("$limit", 1L)))),
    33 new Document("$set", new Document("meta", new Document("$arrayElemAt", Arrays.asList("$meta", 0L)))));
    34 // run pipeline and print results
    35 collection.aggregate(agg)
    36 .forEach(doc -> System.out.println(doc.toJson()));
    37
    38 }
    39 }
    40}

    注意

    要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。

    package com.mongodb.drivers;
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 编译并运行 FacetQuery.java 文件。

    javac FacetQuery.java
    java FacetQuery
    {meta: {
    count: { lowerBound: Long('20878') },
    facet: {
    genresFacet: {
    buckets: [
    { _id: 'Drama', count: Long('12149') },
    { _id: 'Comedy', count: Long('6436') },
    { _id: 'Romance', count: Long('3274') },
    { _id: 'Crime', count: Long('2429') },
    { _id: 'Thriller', count: Long('2400') },
    { _id: 'Action', count: Long('2349') },
    { _id: 'Adventure', count: Long('1876') },
    { _id: 'Documentary', count: Long('1755') },
    { _id: 'Horror', count: Long('1432') },
    { _id: 'Biography', count: Long('1244') }
    ]
    },
    yearFacet: {
    buckets: [
    { _id: 1910, count: Long('14') },
    { _id: 1920, count: Long('47') },
    { _id: 1930, count: Long('238') }
    ]
    }
    }
    }}
1

mongodb-driver-kotlin-coroutine

4.10.0 或更高版本

2
  1. 创建一个名为 FacetQuery.kt 的文件。

  2. 将以下代码复制并粘贴到 FacetQuery.kt 文件。

    此代码示例将执行以下任务:

    • 导入mongodb包和依赖项。

    • 建立与您的 Atlas 集群的连接。

    • 使用以下内容查询集合:

      • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

      • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    • 打印与 AggregateFlow 实例中的查询相匹配的文档。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1import com.mongodb.kotlin.client.coroutine.MongoClient
    2import kotlinx.coroutines.runBlocking
    3import org.bson.Document
    4import java.time.Instant
    5import java.util.*
    6
    7fun main() {
    8 // connect to your Atlas cluster
    9 val uri = "<connection-string>"
    10 val mongoClient = MongoClient.create(uri)
    11
    12 // set namespace
    13 val database = mongoClient.getDatabase("sample_mflix")
    14 val collection = database.getCollection<Document>("movies")
    15
    16 runBlocking {
    17 // define pipeline
    18 val agg = Document(
    19 "\$searchMeta",
    20 Document("index", "facet-tutorial")
    21 .append(
    22 "facet",
    23 Document(
    24 "operator",
    25 Document(
    26 "near",
    27 Document("path", "released")
    28 .append("origin", Date.from(Instant.parse("1921-11-01T00:00:00.000+00:00")))
    29 .append("pivot", 7776000000L)
    30 )
    31 )
    32 .append(
    33 "facets",
    34 Document(
    35 "genresFacet",
    36 Document("type", "string").append("path", "genres")
    37 )
    38 .append(
    39 "yearFacet",
    40 Document("type", "number").append("path", "year")
    41 .append("boundaries", listOf(1910, 1920, 1930, 1940))
    42 )
    43 )
    44 )
    45 )
    46
    47 // run pipeline and print results
    48 val resultsFlow = collection.aggregate<Document>(
    49 listOf(agg)
    50 )
    51 resultsFlow.collect { println(it) }
    52 }
    53 mongoClient.close()
    54}
    1import com.mongodb.kotlin.client.coroutine.MongoClient
    2import kotlinx.coroutines.flow.collect
    3import kotlinx.coroutines.runBlocking
    4import org.bson.Document
    5import java.time.Instant
    6import java.util.Date
    7
    8fun main() {
    9 // Connection URI for your MongoDB Atlas cluster
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12
    13 // Set namespace (database and collection)
    14 val database = mongoClient.getDatabase("sample_mflix")
    15 val collection = database.getCollection<Document>("movies")
    16
    17 runBlocking {
    18 // Define the aggregation pipeline
    19 val searchStage = Document("\$search", Document("index", "facet-tutorial")
    20 .append("facet", Document("operator", Document("near", Document("path", "released")
    21 // Replace +00:00 with Z
    22 .append("origin", Date.from(Instant.parse("1921-11-01T00:00:00.000Z")))
    23 .append("pivot", 7776000000L)))
    24 .append("facets", Document("genresFacet", Document("type", "string")
    25 .append("path", "genres"))
    26 .append("yearFacet", Document("type", "number").append("path", "year")
    27 .append("boundaries", listOf(1910, 1920, 1930, 1940))))))
    28
    29 val facetStage = Document("\$facet", Document("meta", listOf(
    30 Document("\$replaceWith", "\$\$SEARCH_META"),
    31 Document("\$limit", 1)
    32 )))
    33
    34 val setStage = Document("\$set", Document("meta", Document("\$arrayElemAt", listOf("\$meta", 0))))
    35
    36 // Run the aggregation pipeline and print results
    37 val resultsFlow = collection.aggregate<Document>(
    38 listOf(searchStage, facetStage, setStage)
    39 )
    40
    41 resultsFlow.collect { println(it.toJson()) } // Convert each result to JSON and print
    42 }
    43
    44 // Close the MongoDB client
    45 mongoClient.close()
    46}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行 FacetQuery.kt 文件。

    当您在 IDE 中运行 FacetQuery.kt 程序时,它会打印以下结果:

    Document{{
    count=Document{{lowerBound=20878}},
    facet=Document{{
    genresFacet=Document{{
    buckets=[
    Document{{_id=Drama, count=12149}},
    Document{{_id=Comedy, count=6436}},
    Document{{_id=Romance, count=3274}},
    Document{{_id=Crime, count=2429}},
    Document{{_id=Thriller, count=2400}},
    Document{{_id=Action, count=2349}},
    Document{{_id=Adventure, count=1876}},
    Document{{_id=Documentary, count=1755}},
    Document{{_id=Horror, count=1432}},
    Document{{_id=Biography, count=1244}}
    ]
    }},
    yearFacet=Document{{
    buckets=[
    Document{{_id=1910, count=14}},
    Document{{_id=1920, count=47}},
    Document{{_id=1930, count=238}}
    ]
    }}
    }}
    }}
1
  1. 创建一个名为 facet-query.js 的文件。

  2. 将以下代码复制并粘贴到 facet-query.js 文件。

    此代码示例将执行以下任务:

    • 导入 mongodb,即 MongoDB 的 Node.js 驱动程序。

    • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

    • 使用以下 searchMeta 子句来查询集合:

      • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

      • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    • 遍历游标以打印与查询匹配的文档。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1const { MongoClient } = require("mongodb");
    2
    3// connect to your Atlas cluster
    4const uri =
    5 "<connection-string>";
    6
    7const client = new MongoClient(uri);
    8
    9async function run() {
    10 try {
    11 await client.connect();
    12
    13 // set namespace
    14 const database = client.db("sample_mflix");
    15 const coll = database.collection("movies");
    16
    17 // define pipeline
    18 const agg = [{$searchMeta: {
    19 index: "facet-tutorial",
    20 facet: {
    21 operator: {
    22 near: {path: "released", origin: new Date("1921-11-01T00:00:00.000Z"), pivot: 7776000000}
    23 },
    24 facets: {
    25 genresFacet: {type: "string", path: "genres"},
    26 yearFacet: {type: "number", path: "year",boundaries: [1910,1920,1930,1940]}
    27 }}}}];
    28 // run pipeline
    29 const result = coll.aggregate(agg);
    30
    31 // print results
    32 await result.forEach((doc) => console.dir(JSON.stringify(doc)));
    33 } finally {
    34 await client.close();
    35 }
    36}
    37run().catch(console.dir);
    1const { MongoClient } = require("mongodb");
    2
    3// connect to your Atlas cluster
    4const uri = "<connection-string>";
    5
    6const client = new MongoClient(uri);
    7
    8async function run() {
    9 try {
    10 await client.connect();
    11
    12 // set namespace
    13 const database = client.db("sample_mflix");
    14 const coll = database.collection("movies");
    15
    16 // define pipeline
    17 const agg = [
    18 {
    19 '$search': {
    20 'index': "facet-tutorial",
    21 'facet': {
    22 'operator': {
    23 'near': {
    24 'path': 'released',
    25 'origin': new Date('Tue, 01 Nov 1921 00:00:00 GMT'),
    26 'pivot': 7776000000
    27 }
    28 },
    29 'facets': {
    30 'genresFacet': {
    31 'type': 'string',
    32 'path': 'genres'
    33 },
    34 'yearFacet': {
    35 'type': 'number',
    36 'path': 'year',
    37 'boundaries': [1910, 1920, 1930, 1940]
    38 }
    39 }
    40 }
    41 }
    42 }, {
    43 '$facet': {
    44 'meta': [
    45 {
    46 '$replaceWith': '$$SEARCH_META'
    47 }, {
    48 '$limit': 1
    49 }
    50 ]
    51 }
    52 }, {
    53 '$set': {
    54 'meta': {
    55 '$arrayElemAt': ['$meta', 0]
    56 }
    57 }
    58 }
    59 ];
    60 // run pipeline
    61 const result = coll.aggregate(agg);
    62
    63 // print results
    64 await result.forEach((doc) => console.dir(JSON.stringify(doc)));
    65 } finally {
    66 await client.close();
    67 }
    68}
    69run().catch(console.dir);
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    node facet-query.js
    '{
    "meta":{
    "count":{"lowerBound":20878},
    "facet":{
    "genresFacet":{
    "buckets":[
    {"_id":"Drama","count":12149},
    {"_id":"Comedy","count":6436},
    {"_id":"Romance","count":3274},
    {"_id":"Crime","count":2429},
    {"_id":"Thriller","count":2400},
    {"_id":"Action","count":2349},
    {"_id":"Adventure","count":1876},
    {"_id":"Documentary","count":1755},
    {"_id":"Horror","count":1432},
    {"_id":"Biography","count":1244}
    ]
    },
    "yearFacet":{
    "buckets":[
    {"_id":1910,"count":14},
    {"_id":1920,"count":47},
    {"_id":1930,"count":238}
    ]
    }
    }
    }
    }'
1
  1. 创建一个名为 facet-query.py 的文件。

    touch facet-query.py
  2. 将以下代码复制并粘贴到 facet-query.py 文件。

    以下代码示例:

    • 导入 pymongo 、MongoDB 的 Python 驱动程序和 dns 模块,这是使用 DNS 种子列表连接字符串将 pymongo 连接到 Atlas 所必需的。

    • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

    • 使用以下内容查询集合:

      • near 搜索 1921 年 11 月 11 日前后上映的电影,要求电影相对于 originpivot 距离为大约三个月

      • facets 要请求 genres string 数组字段中每种类型的电影数,以及 1910 到 1939 年中的电影数,包括

    • 遍历游标以打印与查询匹配的文档。

    您可以使用$searchMeta或使用$searchSEARCH_META 聚合变量来运行此查询。

    1import pymongo
    2import datetime
    3
    4# connect to your Atlas cluster
    5client = pymongo.MongoClient('<connection-string>')
    6
    7# define pipeline
    8pipeline = [{"$searchMeta": {
    9 "index": "facet-tutorial",
    10 "facet": {
    11 "operator": {
    12 "near": {"path": "released", "origin": datetime.datetime(1921, 11, 1, 0, 0, 0, 0), "pivot": 7776000000}
    13 },
    14 "facets": {
    15 "genresFacet": {"type": "string", "path": "genres"},
    16 "yearFacet" : {"type" : "number", "path" : "year", "boundaries" : [1910,1920,1930,1940]}
    17 }}}}]
    18# run pipeline
    19result = client["sample_mflix"]["movies"].aggregate(pipeline)
    20
    21# print results
    22for i in result:
    23 print(i)
    1import pymongo
    2from datetime import datetime, timezone # Import timezone for tzinfo=timezone.utc
    3
    4# Connect to your Atlas cluster
    5client = pymongo.MongoClient("<connection-string>")
    6
    7# Define pipeline
    8pipeline = [{
    9 '$search': {
    10 'index': 'facet-tutorial',
    11 'facet': {
    12 'operator': {
    13 'near': {
    14 'path': 'released',
    15 'origin': datetime(1921, 11, 1, 0, 0, 0, tzinfo=timezone.utc), # Corrected timezone
    16 'pivot': 7776000000
    17 }
    18 },
    19 'facets': {
    20 'genresFacet': {
    21 'type': 'string', 'path': 'genres'
    22 },
    23 'yearFacet': {
    24 'type': 'number', 'path': 'year', 'boundaries': [1910, 1920, 1930, 1940]
    25 }
    26 }
    27 }
    28 }
    29}, {
    30 '$facet': {
    31 'meta': [
    32 {'$replaceWith': '$$SEARCH_META'},
    33 {'$limit': 1}
    34 ]
    35 }
    36}, {
    37 '$set': {
    38 'meta': {'$arrayElemAt': ['$meta', 0]}
    39 }
    40}]
    41# Run pipeline
    42result = client["sample_mflix"]["movies"].aggregate(pipeline)
    43
    44# Print results
    45for doc in result:
    46 print(doc)
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    python facet-query.py
    {
    'meta': {
    'count': {'lowerBound': 20878},
    'facet': {
    'genresFacet': {
    'buckets': [
    {'_id': 'Drama', 'count': 12149},
    {'_id': 'Comedy', 'count': 6436},
    {'_id': 'Romance', 'count': 3274},
    {'_id': 'Crime', 'count': 2429},
    {'_id': 'Thriller', 'count': 2400},
    {'_id': 'Action', 'count': 2349},
    {'_id': 'Adventure', 'count': 1876},
    {'_id': 'Documentary', 'count': 1755},
    {'_id': 'Horror', 'count': 1432},
    {'_id': 'Biography', 'count': 1244}
    ]
    },
    'yearFacet': {
    'buckets': [
    {'_id': 1910, 'count': 14},
    {'_id': 1920, 'count': 47},
    {'_id': 1930, 'count': 238}
    ]
    }
    }
    }
    }

结果显示两种类型的分面搜索的元数据结果。genresFacet 文档显示每类电影的数量,yearFacet 文档显示边界内的电影数量:

  • 1910,包括 1910 存储桶的下限

  • 19201910 存储桶不包括上边界,1920 存储桶包括下边界

  • 19301920 存储桶不包括上边界,1930 存储桶包括下边界

您可以通过我们的课程视频了解有关 Atlas Search 中的分面的更多信息。

要了解有关在 Atlas Search 中使用分面的更多信息,请学习 MongoDB University 中 MongoDB 入门课程第 9 单元。该单元时长 1.5 小时,包括 Atlas Search 概述以及有关创建 Atlas Search 索引、使用复合操作符运行 $search 查询以及使用 facet 对结果进行分组的课程。

观看此视频,了解如何在查询中创建和使用数字和字符串分,对结果进行分组并检索分组中的结果计数。

时长:11 分钟

后退

自动完成(Autocomplete)