如何对数组中的对象运行 Atlas Search 查询
Overview
本教程介绍如何对数组 ( embeddedDocuments
) 内的文档字段或对象进行索引和运行 Atlas Search 查询。 本页面包含使用 样本集合 的样本 索引 运行 样本查询 的说明,该索引是我们在 Atlas Search Playground 中为您设置的,或者您可以在 Atlas 集群上加载、配置和运行的。
关于样本集合
样本集合名为schools
,包含三个文档。 样本集合中的每个文档都包含学校的name
和mascot
、学校教师的first
和last
姓名、每位教师所教的classes
,包括subject
姓名和grade
级别,以及学校学生的各种clubs
。
关于 Atlas Search 索引
集合的索引定义显示以下内容:
关于查询
该示例查询Atlas Search schools
集合中的嵌入式文档。 查询使用以下管道阶段:
$search
搜索集合。$project
以在集合中包含和排除字段,并在结果中添加名为score
的字段。 对于启用突出显示的查询,$project
阶段还添加了一个名为highlights
的新字段,其中包含突出显示信息。
本教程演示了三种不同的查询。
该查询演示了针对嵌套文档数组内部字段的搜索。
它在 teachers
路径中搜索名字为 John
的教师,并为姓氏为 Smith
的教师指定首选项。它还启用对 last
名称字段的突出显示。
该查询演示了针对嵌套在文档中的文档数组内的字段的搜索。
它搜索的是那些拥有体育社团的学校,而这些社团为学生提供了在 clubs.sports
路径上参加 dodgeball
或 frisbee
比赛的机会。
该查询演示了对文档数组内部字段的搜索,以及对嵌套在文档数组中的文档数组内部字段的搜索。
它会搜索在 teachers.classes
路径上有教师教授 12th
年级 science
课程的学校,优先选择有姓氏为 Smith
的教师教授该课程的学校。它还可以突出显示嵌套在文档数组 teachers
内的文档数组 classes
的 subject
字段。
在 Atlas Search Playground 中尝试
在Atlas Search Playground上,我们设置了一个嵌入式文档集合,为集合中的字段预先配置了索引,并定义了可针对该集合运行的查询。 您还可以在 Atlas Search Playground 中修改集合、索引和查询。
要在 Atlas Search Playground 上尝试此查询,请执行以下操作:
访问 Atlas Search Playground。
在 Atlas Search Playground 中访问带有对象示例查询的嵌套数组。
要在 Atlas Search Playground 上尝试此查询,请执行以下操作:
访问 Atlas Search Playground。
在 Atlas Search Playground 中访问数组示例查询中的嵌套数组。
在 Atlas 集群上试用
为了演示如何对嵌入式文档运行查询,本节将引导您完成以下步骤:
在 Atlas 集群中创建一个包含嵌入式文档的集合示例,将其命名为
schools
。使用在以下路径配置的 embeddedDocuments 字段设置 Atlas Search 索引:
teachers
字段teachers.classes
字段clubs.sports
字段
运行
$search
查询,使用复合操作符以及 embeddedDocument 和 text 操作符来搜索schools
集合中的嵌入文档。针对嵌入式文档字段运行
$searchMeta
查询以获取计数。
开始之前,确保 Atlas 集群满足先决条件中所述的要求。对于本教程,您无需上传示例数据,因为您将创建一个新集合并加载运行本教程中的查询所需的文档。
创建示例集合并加载数据
您必须首先在 Atlas 集群上的现有或新数据库中创建名为schools
的集合。 创建集合后,您必须将示例数据上传到集合中。 要了解有关样本集合中文档的更多信息,请参阅关于样本集合。
本部分中各步骤将指导您创建新的数据库和集合,并将示例数据加载到集合中。
在Atlas中,转到项目的Clusters 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未显示,请单击侧边栏中的Clusters 。
会显示集群页面。
GoCollections 页面。
单击集群的对应 Browse Collections 按钮。
显示数据浏览器。
将以下文档加载到集合中。
如果未选中
schools
,则将其选中。单击每个示例文档的 Insert Document 以将其添加到集合中。
单击 JSON 视图 ({}) 替换默认文档。
逐一复制并粘贴以下示例文档,然后单击 Insert,将文档逐一添加到集合。
{ "_id": 0, "name": "Springfield High", "mascot": "Pumas", "teachers": [{ "first": "Jane", "last": "Smith", "classes": [{ "subject": "art of science", "grade": "12th" }, { "subject": "applied science and practical science", "grade": "9th" }, { "subject": "remedial math", "grade": "12th" }, { "subject": "science", "grade": "10th" }] }, { "first": "Bob", "last": "Green", "classes": [{ "subject": "science of art", "grade": "11th" }, { "subject": "art art art", "grade": "10th" }] }], "clubs": { "stem": [ { "club_name": "chess", "description": "provides students opportunity to play the board game of chess informally and competitively in tournaments." }, { "club_name": "kaboom chemistry", "description": "provides students opportunity to experiment with chemistry that fizzes and explodes." } ], "arts": [ { "club_name": "anime", "description": "provides students an opportunity to discuss, show, and collaborate on anime and broaden their Japanese cultural understanding." }, { "club_name": "visual arts", "description": "provides students an opportunity to train, experiment, and prepare for internships and jobs as photographers, illustrators, graphic designers, and more." } ] } } { "_id": 1, "name": "Evergreen High", "mascot": "Jaguars", "teachers": [{ "first": "Jane", "last": "Earwhacker", "classes": [{ "subject": "art", "grade": "9th" }, { "subject": "science", "grade": "12th" }] }, { "first": "John", "last": "Smith", "classes": [{ "subject": "math", "grade": "12th" }, { "subject": "art", "grade": "10th" }] }], "clubs": { "sports": [ { "club_name": "archery", "description": "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." }, { "club_name": "ultimate frisbee", "description": "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." } ], "stem": [ { "club_name": "zapped", "description": "provides students an opportunity to make exciting gadgets and explore electricity." }, { "club_name": "loose in the chem lab", "description": "provides students an opportunity to put the scientific method to the test and get elbow deep in chemistry." } ] } } { "_id": 2, "name": "Lincoln High", "mascot": "Sharks", "teachers": [{ "first": "Jane", "last": "Smith", "classes": [{ "subject": "science", "grade": "9th" }, { "subject": "math", "grade": "12th" }] }, { "first": "John", "last": "Redman", "classes": [{ "subject": "art", "grade": "12th" }] }], "clubs": { "arts": [ { "club_name": "ceramics", "description": "provides students an opportunity to acquire knowledge of form, volume, and space relationships by constructing hand-built and wheel-thrown forms of clay." }, { "club_name": "digital art", "description": "provides students an opportunity to learn about design for entertainment, 3D animation, technical art, or 3D modeling." } ], "sports": [ { "club_name": "dodgeball", "description": "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." }, { "club_name": "martial arts", "description": "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." } ] } }
创建 Atlas Search 索引
在本部分中,您将为 local_school_district.schools
集合中嵌入式文档的字段创建 Atlas Search 索引。
必需的访问权限
要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin
或更高的项目访问权限。
步骤
在Atlas中,转到项目的Clusters 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未显示,请单击侧边栏中的Clusters 。
会显示集群页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击 Services 标题下的 Atlas Search。
从 Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search。
将显示 Atlas Search 页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击该集合的 Search Indexes 标签页。
将显示 Atlas Search 页面。
单击集群的名称。
单击 Atlas Search 标签页。
将显示 Atlas Search 页面。
输入Index Name ,然后设立Database and Collection 。
在 Index Name 字段中输入
embedded-documents-tutorial
。如果将索引命名为
default
,则在使用 $search 管道阶段时无需指定index
参数。如果您为索引指定了自定义名称,则必须在index
参数中指定此名称。在 Database and Collection(数据库和集合)部分中找到
local_school_district
数据库,然后选择schools
集合。
指定为嵌入文档编制索引的索引配置。
要了解有关索引定义的更多信息,请参阅关于 Atlas Search 索引。
单击 Next(连接)。
单击 Refine Your Index(连接)。
单击 Field Mappings 部分中的 Add Field,在 Add Field Mapping 窗口中逐一配置每个字段的设置后,单击 Add 在 Customized Configuration 标签页中添加以下字段。
Field NameData TypeEnable Dynamic Mappingteachers
EmbeddedDocumentsOn(开启)teachers.classes
EmbeddedDocumentsOn(开启)teachers
DocumentOn(开启)teachers.classes
DocumentOn(开启)teachers.classes.grade
StringFacet不适用clubs.sports
EmbeddedDocumentsOn(开启)点击 Add Field Mappings 打开 Add Field Mapping 窗口。
从下拉列表中选择以下内容。
点击 Add Field Mappings 打开 Add Field Mapping 窗口。
从下拉列表中选择以下内容。
如果尚未启用,请切换以启用 Enable Dynamic Mapping,然后单击 Add
单击 Save(连接)。
单击 Save Changes(连接)。
将默认索引定义替换为以下索引定义。
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "clubs": { 6 "dynamic": true, 7 "fields": { 8 "sports": { 9 "dynamic": true, 10 "type": "embeddedDocuments" 11 } 12 }, 13 "type": "document" 14 }, 15 "teachers": [ 16 { 17 "dynamic": true, 18 "fields": { 19 "classes": { 20 "dynamic": true, 21 "type": "embeddedDocuments" 22 } 23 }, 24 "type": "embeddedDocuments" 25 }, 26 { 27 "dynamic": true, 28 "fields": { 29 "classes": { 30 "dynamic": true, 31 "fields": { 32 "grade": { 33 "type": "stringFacet" 34 } 35 }, 36 "type": "document" 37 } 38 }, 39 "type": "document" 40 } 41 ] 42 } 43 } 44 } 单击 Next(连接)。
$search
对嵌入式文档字段运行 查询
您可以针对嵌入式文档字段运行查询。本教程在查询中使用复合运算符中的 embeddedDocument 和文本运算符。
在本部分,您将连接到 Atlas 集群并使用该运算符针对 schools
集合中的字段运行样本查询。
➤ 使用本页的“选择语言”下拉菜单设置本节示例的语言。
在Atlas中,转到项目的Clusters 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未显示,请单击侧边栏中的Clusters 。
会显示集群页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击 Services 标题下的 Atlas Search。
从 Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search。
将显示 Atlas Search 页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击该集合的 Search Indexes 标签页。
将显示 Atlas Search 页面。
单击集群的名称。
单击 Atlas Search 标签页。
将显示 Atlas Search 页面。
使用embeddedDocument
操作符对 集合运行Atlas Search查询。schools
将以下查询复制并粘贴到 Query Editor 中,然后点击 Query Editor 中的 Search 按钮。
要了解有关此查询的更多信息,请参阅关于查询。
1 [ 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "teachers", 7 "operator": { 8 "compound": { 9 "must": [{ 10 "text": { 11 "path": "teachers.first", 12 "query": "John" 13 } 14 }], 15 "should":[{ 16 "text": { 17 "path": "teachers.last", 18 "query": "Smith" 19 } 20 }] 21 } 22 } 23 } 24 } 25 } 26 ]
SCORE: 0.7830756902694702 _id: "1" name: "Evergreen High" mascot: "Jaguars" teachers: Array 0: Object first: "Jane" last: "Earwhacker" classes: Array ... 1: Object first: "John" last: "Smith" classes: Array ... clubs: Object ... SCORE: 0.468008816242218 _id: "2" name: "Lincoln High" mascot: "Sharks" teachers: Array 0: Object first: "Jane" last: "Smith" classes: Array ... 1: Object first: "John" last: "Redman" classes: Array ... clubs: Object ...
要了解有关此查询的更多信息,请参阅关于查询。
1 [ 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "clubs.sports", 7 "operator": { 8 "queryString": { 9 "defaultPath": "clubs.sports.club_name", 10 "query": "dodgeball OR frisbee" 11 } 12 } 13 } 14 } 15 } 16 ]
score: 0.633669912815094 _id: 2 name: "Lincoln High" mascot: "Sharks" teachers: Array ... clubs: Object sports: Array (2) 0: Object club_name: "dodgeball" description: "provides students an opportunity to play dodgeball by throwing balls t…" 1: Object club_name: "martial arts" description: "provides students an opportunity to learn self-defense or combat that …" stem: Array (2) ... score: 0.481589138507843 _id: 1 name: "Evergreen High" mascot: "Jaguars" teachers: Array ... clubs: Object sports: Array (2) 0: Object club_name: "archery" description: "provides students an opportunity to practice and hone the skill of usi…" 1: Object club_name: "ultimate frisbee" description: "provides students an opportunity to play frisbee and learn the basics …" stem: Array (2) ...
要了解有关此查询的更多信息,请参阅关于查询。
[ { $search: { index: "embedded-documents-tutorial", "embeddedDocument": { "path": "teachers", "operator": { "compound": { "must": [{ "embeddedDocument": { "path": "teachers.classes", "operator": { "compound": { "must": [{ "text": { "path": "teachers.classes.grade", "query": "12th" } }, { "text": { "path": "teachers.classes.subject", "query": "science" } }] } } } }], "should": [{ "text": { "path": "teachers.last", "query": "smith" } }] } } } } } ]
SCORE: 0.9415585994720459 name: "Springfield High" mascot: "Pumas" teachers: Array 0: Object first: "Jane" last: "Smith" classes: Array 0: Object subject: "art of science" grade: "12th" 1: Object subject: "applied science and practical science" grade: "9th" 2: Object subject: "remedial math" grade: "12th" 3: Object subject: "science" grade: "10th" 1: Object first: "Bob" last: "Green" classes: Array 0: Object subject: "science of art" grade: "11th" 1: Object subject: "art art art" grade: "10th" clubs: Object ... SCORE: 0.7779859304428101 _id: "1" name: "Evergreen High" mascot: "Jaguars" teachers: Array 0: Object first: "Jane" last: "Earwhacker" classes: Array 0: Object subject: "art" grade: "9th" 1: Object subject: "science" grade: "12th" 1: Object first: "John" last: "Smith" classes: Array 0: Object subject: "math" grade: "12th" 1: Object subject: "art" grade: "10th" clubs: Object ...
使用mongosh
连接到您的集群。
在终端窗口中打开mongosh
并连接到集群。 有关连接的详细说明,请参阅通过mongosh
连接。
使用local_school
数据库。
在 mongosh
提示符下运行以下命令:
use local_school_district
switched to db local_school_district
针对 集合运行以下Atlasschools
Search查询。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 db.schools.aggregate({ 2 "$search": { 3 "index": "embedded-documents-tutorial", 4 "embeddedDocument": { 5 "path": "teachers", 6 "operator": { 7 "compound": { 8 "must": [{ 9 "text": { 10 "path": "teachers.first", 11 "query": "John" 12 } 13 }], 14 "should":[{ 15 "text": { 16 "path": "teachers.last", 17 "query": "Smith" 18 } 19 }] 20 } 21 } 22 }, 23 "highlight": { 24 "path": "teachers.last" 25 } 26 } 27 }, 28 { 29 "$project": { 30 "_id": 1, 31 "teachers": 1, 32 "score": { $meta: "searchScore" }, 33 "highlights": { "$meta": "searchHighlights" } 34 } 35 })
1 [ 2 { 3 _id: 1, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Earwhacker', 8 classes: [ 9 { subject: 'art', grade: '9th' }, 10 { subject: 'science', grade: '12th' } 11 ] 12 }, 13 { 14 first: 'John', 15 last: 'Smith', 16 classes: [ 17 { subject: 'math', grade: '12th' }, 18 { subject: 'art', grade: '10th' } 19 ] 20 } 21 ], 22 score: 0.7830756902694702, 23 highlights: [ 24 { 25 score: 1.4921371936798096, 26 path: 'teachers.last', 27 texts: [ { value: 'Smith', type: 'hit' } ] 28 } 29 ] 30 }, 31 { 32 _id: 2, 33 teachers: [ 34 { 35 first: 'Jane', 36 last: 'Smith', 37 classes: [ 38 { subject: 'science', grade: '9th' }, 39 { subject: 'math', grade: '12th' } 40 ] 41 }, 42 { 43 first: 'John', 44 last: 'Redman', 45 classes: [ { subject: 'art', grade: '12th' } ] 46 } 47 ], 48 score: 0.468008816242218, 49 highlights: [ 50 { 51 score: 1.4702850580215454, 52 path: 'teachers.last', 53 texts: [ { value: 'Smith', type: 'hit' } ] 54 } 55 ] 56 } 57 ]
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
要了解有关此查询的更多信息,请参阅关于查询。
1 db.schools.aggregate( 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "clubs.sports", 7 "operator": { 8 "queryString": { 9 "defaultPath": "clubs.sports.club_name", 10 "query": "dodgeball OR frisbee" 11 } 12 } 13 } 14 } 15 }, 16 { 17 "$project": { 18 "_id": 1, 19 "name": 1, 20 "clubs.sports": 1, 21 "score": { $meta: "searchScore" } 22 } 23 } 24 )
1 [ 2 { 3 _id: 2, 4 name: 'Lincoln High', 5 clubs: { 6 sports: [ 7 { 8 club_name: 'dodgeball', 9 description: 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 10 }, 11 { 12 club_name: 'martial arts', 13 description: 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 14 } 15 ] 16 }, 17 score: 0.633669912815094 18 }, 19 { 20 _id: 1, 21 name: 'Evergreen High', 22 clubs: { 23 sports: [ 24 { 25 club_name: 'archery', 26 description: 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 27 }, 28 { 29 club_name: 'ultimate frisbee', 30 description: 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 31 } 32 ] 33 }, 34 score: 0.481589138507843 35 } 36 ]
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
要了解有关此查询的更多信息,请参阅关于查询。
1 db.schools.aggregate({ 2 "$search": { 3 "index": "embedded-documents-tutorial", 4 "embeddedDocument": { 5 "path": "teachers", 6 "operator": { 7 "compound": { 8 "must": [{ 9 "embeddedDocument": { 10 "path": "teachers.classes", 11 "operator": { 12 "compound": { 13 "must": [{ 14 "text": { 15 "path": "teachers.classes.grade", 16 "query": "12th" 17 } 18 }, 19 { 20 "text": { 21 "path": "teachers.classes.subject", 22 "query": "science" 23 } 24 }] 25 } 26 } 27 } 28 }], 29 "should": [{ 30 "text": { 31 "path": "teachers.last", 32 "query": "smith" 33 } 34 }] 35 } 36 } 37 }, 38 "highlight": { 39 "path": "teachers.classes.subject" 40 } 41 } 42 }, 43 { 44 "$project": { 45 "_id": 1, 46 "teachers": 1, 47 "score": { $meta: "searchScore" }, 48 "highlights": { "$meta": "searchHighlights" } 49 } 50 })
1 [ 2 { 3 _id: 0, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Smith', 8 classes: [ 9 { subject: 'art of science', grade: '12th' }, 10 { 11 subject: 'applied science and practical science', 12 grade: '9th' 13 }, 14 { subject: 'remedial math', grade: '12th' }, 15 { subject: 'science', grade: '10th' } 16 ] 17 }, 18 { 19 first: 'Bob', 20 last: 'Green', 21 classes: [ 22 { subject: 'science of art', grade: '11th' }, 23 { subject: 'art art art', grade: '10th' } 24 ] 25 } 26 ], 27 score: 0.9415585994720459, 28 highlights: [ 29 { 30 score: 0.7354040145874023, 31 path: 'teachers.classes.subject', 32 texts: [ 33 { value: 'art of ', type: 'text' }, 34 { value: 'science', type: 'hit' } 35 ] 36 }, 37 { 38 score: 0.7871346473693848, 39 path: 'teachers.classes.subject', 40 texts: [ 41 { value: 'applied ', type: 'text' }, 42 { value: 'science', type: 'hit' }, 43 { value: ' and practical ', type: 'text' }, 44 { value: 'science', type: 'hit' } 45 ] 46 }, 47 { 48 score: 0.7581484317779541, 49 path: 'teachers.classes.subject', 50 texts: [ { value: 'science', type: 'hit' } ] 51 }, 52 { 53 score: 0.7189631462097168, 54 path: 'teachers.classes.subject', 55 texts: [ 56 { value: 'science', type: 'hit' }, 57 { value: ' of art', type: 'text' } 58 ] 59 } 60 ] 61 }, 62 { 63 _id: 1, 64 teachers: [ 65 { 66 first: 'Jane', 67 last: 'Earwhacker', 68 classes: [ 69 { subject: 'art', grade: '9th' }, 70 { subject: 'science', grade: '12th' } 71 ] 72 }, 73 { 74 first: 'John', 75 last: 'Smith', 76 classes: [ 77 { subject: 'math', grade: '12th' }, 78 { subject: 'art', grade: '10th' } 79 ] 80 } 81 ], 82 score: 0.7779859304428101, 83 highlights: [ 84 { 85 score: 1.502043604850769, 86 path: 'teachers.classes.subject', 87 texts: [ { value: 'science', type: 'hit' } ] 88 } 89 ] 90 } 91 ]
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
在 MongoDB Compass 中连接到您的集群。
打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。
针对 集合运行以下Atlasschools
Search查询。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
管道阶段 | 查询 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$search |
| |||||||||||||||||||||||||
$project |
如果启用了 Auto Preview,MongoDB Compass 将在 |
1 [ 2 { 3 _id: 1, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Earwhacker', 8 classes: [ 9 { subject: 'art', grade: '9th' }, 10 { subject: 'science', grade: '12th' } 11 ] 12 }, 13 { 14 first: 'John', 15 last: 'Smith', 16 classes: [ 17 { subject: 'math', grade: '12th' }, 18 { subject: 'art', grade: '10th' } 19 ] 20 } 21 ], 22 score: 0.7830756902694702, 23 highlights: [ 24 { 25 score: 1.4921371936798096, 26 path: 'teachers.last', 27 texts: [ { value: 'Smith', type: 'hit' } ] 28 } 29 ] 30 }, 31 { 32 _id: 2, 33 teachers: [ 34 { 35 first: 'Jane', 36 last: 'Smith', 37 classes: [ 38 { subject: 'science', grade: '9th' }, 39 { subject: 'math', grade: '12th' } 40 ] 41 }, 42 { 43 first: 'John', 44 last: 'Redman', 45 classes: [ { subject: 'art', grade: '12th' } ] 46 } 47 ], 48 score: 0.468008816242218, 49 highlights: [ 50 { 51 score: 1.4702850580215454, 52 path: 'teachers.last', 53 texts: [ { value: 'Smith', type: 'hit' } ] 54 } 55 ] 56 } 57 ]
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
要了解有关此查询的更多信息,请参阅关于查询。
管道阶段 | 查询 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$search |
| ||||||||||||
$project |
如果启用了 Auto Preview,MongoDB Compass 将在 |
1 [ 2 { 3 _id: 2, 4 name: 'Lincoln High', 5 clubs: { 6 sports: [ 7 { 8 club_name: 'dodgeball', 9 description: 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 10 }, 11 { 12 club_name: 'martial arts', 13 description: 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 14 } 15 ] 16 }, 17 score: 0.633669912815094 18 }, 19 { 20 _id: 1, 21 name: 'Evergreen High', 22 clubs: { 23 sports: [ 24 { 25 club_name: 'archery', 26 description: 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 27 }, 28 { 29 club_name: 'ultimate frisbee', 30 description: 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 31 } 32 ] 33 }, 34 score: 0.481589138507843 35 } 36 ]
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
要了解有关此查询的更多信息,请参阅关于查询。
管道阶段 | 查询 | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$search |
| ||||||||||||||||||||||||||||||||||||||||
$project |
如果启用了 Auto Preview,MongoDB Compass 将在 |
1 [ 2 { 3 _id: 0, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Smith', 8 classes: [ 9 { subject: 'art of science', grade: '12th' }, 10 { 11 subject: 'applied science and practical science', 12 grade: '9th' 13 }, 14 { subject: 'remedial math', grade: '12th' }, 15 { subject: 'science', grade: '10th' } 16 ] 17 }, 18 { 19 first: 'Bob', 20 last: 'Green', 21 classes: [ 22 { subject: 'science of art', grade: '11th' }, 23 { subject: 'art art art', grade: '10th' } 24 ] 25 } 26 ], 27 score: 0.9415585994720459, 28 highlights: [ 29 { 30 score: 0.7354040145874023, 31 path: 'teachers.classes.subject', 32 texts: [ 33 { value: 'art of ', type: 'text' }, 34 { value: 'science', type: 'hit' } 35 ] 36 }, 37 { 38 score: 0.7871346473693848, 39 path: 'teachers.classes.subject', 40 texts: [ 41 { value: 'applied ', type: 'text' }, 42 { value: 'science', type: 'hit' }, 43 { value: ' and practical ', type: 'text' }, 44 { value: 'science', type: 'hit' } 45 ] 46 }, 47 { 48 score: 0.7581484317779541, 49 path: 'teachers.classes.subject', 50 texts: [ { value: 'science', type: 'hit' } ] 51 }, 52 { 53 score: 0.7189631462097168, 54 path: 'teachers.classes.subject', 55 texts: [ 56 { value: 'science', type: 'hit' }, 57 { value: ' of art', type: 'text' } 58 ] 59 } 60 ] 61 }, 62 { 63 _id: 1, 64 teachers: [ 65 { 66 first: 'Jane', 67 last: 'Earwhacker', 68 classes: [ 69 { subject: 'art', grade: '9th' }, 70 { subject: 'science', grade: '12th' } 71 ] 72 }, 73 { 74 first: 'John', 75 last: 'Smith', 76 classes: [ 77 { subject: 'math', grade: '12th' }, 78 { subject: 'art', grade: '10th' } 79 ] 80 } 81 ], 82 score: 0.7779859304428101, 83 highlights: [ 84 { 85 score: 1.502043604850769, 86 path: 'teachers.classes.subject', 87 texts: [ { value: 'science', type: 'hit' } ] 88 } 89 ] 90 } 91 ]
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
将查询复制并粘贴到Program.cs
文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class NestedArrayExample 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 SchoolDocument 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 districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 20 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 21 22 // define variables for query 23 var compoundQuery = Builders<TeacherDocument>.Search.Compound() 24 .Must(Builders<TeacherDocument>.Search.Text(teacher => teacher.First, "John")) 25 .Should(Builders<TeacherDocument>.Search.Text(teacher => teacher.Last, "Smith")); 26 var opts = new SearchHighlightOptions<SchoolDocument>(school => school.Teachers.Select(teacher => teacher.Last));; 27 28 // define and run pipeline 29 var results = schoolsCollection.Aggregate() 30 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 31 school => school.Teachers, compoundQuery), opts, 32 indexName: "embedded-documents-tutorial" 33 ) 34 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 35 .Include(school => school.Name) 36 .Include(school => school.Mascot) 37 .Include(school => school.Teachers) 38 .MetaSearchScore(school => school.Score) 39 .MetaSearchHighlights("highlights")) 40 .ToList(); 41 42 // print results 43 foreach (var school in results) 44 { 45 Console.WriteLine(school.ToJson()); 46 } 47 } 48 } 49 50 [ ]51 public class SchoolDocument 52 { 53 public int Id { get; set; } 54 public string Name { get; set; } 55 public string Mascot { get; set; } 56 public TeacherDocument[] Teachers { get; set; } 57 [ ]58 public List<SearchHighlight> Highlights { get; set; } 59 public double Score { get; set; } 60 } 61 62 [ ]63 public class TeacherDocument 64 { 65 public string First { get; set; } 66 public string Last { get; set; } 67 public ClassDocument[] Classes { get; set; } 68 } 69 70 [ ]71 public class ClassDocument 72 { 73 public string Subject { get; set; } 74 public string Grade { get; set; } 75 }
要了解有关此查询的更多信息,请参阅关于查询。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 using System; 7 using System.Collections.Generic; 8 using System.Reflection.Emit; 9 10 public class NestedArrayWithinObjectExample 11 { 12 private const string MongoConnectionString = "<connection-string>"; 13 14 public static void Main(string[] args) 15 { 16 // allow automapping of the camelCase database fields to our SchoolDocument 17 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 18 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 19 20 // connect to your Atlas cluster 21 var mongoClient = new MongoClient(MongoConnectionString); 22 var districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 23 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 24 25 // define variables for query 26 var queryStringQuery = Builders<ExtraCurricularDocument>.Search.QueryString( 27 sport => sport.ClubName, "dodgeball OR frisbee" 28 ); 29 30 // define and run pipeline 31 var results = schoolsCollection.Aggregate() 32 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 33 school => school.Clubs.Sports, queryStringQuery), 34 indexName: "embedded-documents-tutorial" 35 ) 36 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 37 .Include(school => school.Clubs) 38 .Include(school => school.Name) 39 .Include(school => school.Id) 40 .MetaSearchScore(school => school.Score)) 41 .ToList(); 42 43 // print results 44 foreach (var school in results) 45 { 46 Console.WriteLine(school.ToJson()); 47 } 48 } 49 } 50 51 [ ]52 public class SchoolDocument 53 { 54 public int Id { get; set; } 55 public string Name { get; set; } 56 public ClubDocument Clubs { get; set; } 57 public double Score { get; set; } 58 } 59 60 [ ]61 public class ClubDocument 62 { 63 public ExtraCurricularDocument[] Sports { get; set; } 64 } 65 66 [ ]67 public class ExtraCurricularDocument 68 { 69 [ ]70 public string ClubName { get; set; } 71 public string Description { get; set; } 72 }
要了解有关此查询的更多信息,请参阅关于查询。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class NestedArrayWithinArrayExample 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 SchoolDocument 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 districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 20 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 21 22 // define variables for query 23 var mustQuery = Builders<ClassDocument>.Search.Compound() 24 .Must(Builders<ClassDocument>.Search.Text(classes => classes.Grade, "12th"), Builders<ClassDocument>.Search.Text(classes => classes.Subject, "science")); 25 var compoundQuery = Builders<TeacherDocument>.Search.Compound() 26 .Must(Builders<TeacherDocument>.Search.EmbeddedDocument(teacher => teacher.Classes, mustQuery)) 27 .Should(Builders<TeacherDocument>.Search.Text(teacher => teacher.Last, "smith")); 28 var opts = new SearchHighlightOptions<SchoolDocument>("teachers.classes.subject"); 29 30 // define and run pipeline 31 var results = schoolsCollection.Aggregate() 32 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 33 school => school.Teachers, compoundQuery), opts, 34 indexName: "embedded-documents-tutorial" 35 ) 36 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 37 .Include(school => school.Teachers) 38 .MetaSearchScore(school => school.Score) 39 .MetaSearchHighlights("highlights")) 40 .ToList(); 41 42 // print results 43 foreach (var school in results) 44 { 45 Console.WriteLine(school.ToJson()); 46 } 47 } 48 } 49 50 [ ]51 public class SchoolDocument 52 { 53 public int Id { get; set; } 54 public TeacherDocument[] Teachers { get; set; } 55 [ ]56 public List<SearchHighlight> Highlights { get; set; } 57 public double Score { get; set; } 58 } 59 60 [ ]61 public class TeacherDocument 62 { 63 public string First { get; set; } 64 public string Last { get; set; } 65 public ClassDocument[] Classes { get; set; } 66 } 67 68 [ ]69 public class ClassDocument 70 { 71 public string Subject { get; set; } 72 public string Grade { get; set; } 73 }
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行Program.cs
文件。
dotnet run embedded-documents-query.csproj
{ "_id" : 1, "name" : "Evergreen High", "mascot" : "Jaguars", "teachers" : [{ "first" : "Jane", "last" : "Earwhacker", "classes" : [{ " subject" : "art", "grade" : "9th" }, { "subject" : "science", "grade" : "12th" }] }, { "first" : "John", "last" : "Smith", "classes" : [{ "subject" : "math", "grade" : "12th" }, { "subject" : "art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.last", "score" : 1.4921371936798096, "texts" : [{ "type" : "Hit", "value" : "Smith" }] }], "score" : 0.78307569026947021 } { "_id" : 2, "name" : "Lincoln High", "mascot" : "Sharks", "teachers" : [{ "first" : "Jane", "last" : "Smith", "classes" : [{ "subject" : "science", "grade" : "9th" }, { "subject" : "math", "grade" : "12th" }] }, { "first" : "John", "last" : "Redman", "classes" : [{ "subject" : "art", "grade" : "12th" }] }], "highlights" : [{ "path" : "teachers.last", "score" : 1.4702850580215454, "texts" : [{ "type" : "Hit", "value" : "Smith" }] }], "score" : 0.46800881624221802 }
dotnet run embedded-documents-query.csproj
{ "_id" : 2, "name" : "Lincoln High", "clubs" : { "sports" : [{ "club_name" : "dodgeball", "description" : "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." }, { "club_name" : "martial arts", "description" : "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." }] }, "score" : 0.63366991281509399 } { "_id" : 1, "name" : "Evergreen High", "clubs" : { "sports" : [{ "club_name" : "archery", "description" : "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." }, { "club_name" : "ultimate frisbee", "description" : "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." }] }, "score" : 0.48158913850784302 }
dotnet run embedded-documents-query.csproj
{ "_id" : 0, "teachers" : [{ "first" : "Jane", "last" : "Smith", "classes" : [{ "subject" : "art of science", "grade" : "12th" }, { "subject" : "applied science and practical science", "grade" : "9th" }, { "subject" : "remedial math", "grade" : "12th" }, { "subject" : "science", "grade" : "10th" }] }, { "first" : "Bob", "last" : "Green", "classes" : [{ "subject" : "science of art", "grade" : "11th" }, { "subject" : "art art art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.classes.subject", "score" : 0.73540401458740234, "texts" : [ { "type" : "Text", "value" : "art of " }, { "type" : "Hit", "value" : "science" } ] }, { "path" : "teachers.classes.subject", "score" : 0.78713464736938477, "texts" : [ { "type" : "Text", "value" : "applied " }, { "type" : "Hit", "value" : "science" }, { "type" : "Text", "value" : " and practical " }, { "type" : "Hit", "value" : "science" }] }, { "path" : "teachers.classes.subject", "score" : 0.7581484317779541, "texts" : [{ "type" : "Hit", "value" : "science" }] }, { "path" : "teachers.classes.subject", "score" : 0.7189631462097168, "texts" : [ { "type" : "Hit", "value" : "science" }, { "type" : "Text", "value" : " of art" } ] }], "score" : 0.9415585994720459 } { "_id" : 1, "teachers" : [{ "first" : "Jane", "last" : "Earwhacker", "classes" : [{ "subject" : "art", "grade" : "9th" }, { "subject" : "science", "grade" : "12th" }] }, { "first" : "John", "last" : "Smith", "classes" : [{ "subject" : "math", "grade" : "12th" }, { "subject" : "art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.classes.subject", "score" : 1.502043604850769, "texts" : [{ "type" : "Hit", "value" : "science" }] }], "score" : 0.77798593044281006 }
将查询的代码示例复制并粘贴到相应的文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.M{ 27 "path": "teachers", "operator": bson.M{ 28 "compound": bson.M{ 29 "must": bson.A{ 30 bson.M{ 31 "text": bson.D{ 32 {"path", "teachers.first"}, 33 {"query", "John"}, 34 }, 35 }, 36 }, 37 "should": bson.A{ 38 bson.M{ 39 "text": bson.D{ 40 {"path", "teachers.last"}, 41 {"query", "Smith"}, 42 }, 43 }, 44 }, 45 }, 46 }, 47 }, 48 "highlight": bson.D{{"path", "teachers.last"}}, 49 }}} 50 51 projectStage := bson.D{{"$project", bson.D{{"teachers", 1}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 52 53 // run pipeline 54 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 55 if err != nil { 56 panic(err) 57 } 58 59 // print results 60 var results []bson.D 61 if err = cursor.All(context.TODO(), &results); err != nil { 62 panic(err) 63 } 64 for _, result := range results { 65 fmt.Println(result) 66 } 67 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.D{ 27 {"path", "clubs.sports"}, 28 {"operator", 29 bson.D{ 30 {"queryString", 31 bson.D{ 32 {"defaultPath", "clubs.sports.club_name"}, 33 {"query", "dodgeball OR frisbee"}, 34 }, 35 }, 36 }, 37 }, 38 }, 39 }}} 40 41 projectStage := bson.D{{"$project", bson.D{{"name", 1}, {"clubs.sports", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 42 43 // run pipeline 44 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 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 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.M{ 27 "path": "teachers", 28 "operator": bson.M{ 29 "compound": bson.M{ 30 "must": bson.A{ 31 bson.M{ 32 "embeddedDocument": bson.M{ 33 "path": "teachers.classes", 34 "operator": bson.M{ 35 "compound": bson.M{ 36 "must": bson.A{ 37 bson.M{ 38 "text": bson.D{ 39 {"path", "teachers.classes.grade"}, 40 {"query", "12th"}, 41 }, 42 }, 43 bson.M{ 44 "text": bson.D{ 45 {"path", "teachers.classes.subject"}, 46 {"query", "science"}, 47 }, 48 }, 49 }, 50 }, 51 }, 52 }, 53 }, 54 }, 55 "should": bson.A{ 56 bson.M{ 57 "text": bson.D{ 58 {"path", "teachers.last"}, 59 {"query", "Smith"}, 60 }, 61 }, 62 }, 63 }, 64 }, 65 }, 66 "highlight": bson.D{{"path", "teachers.classes.subject"}}, 67 }}} 68 69 projectStage := bson.D{{"$project", bson.D{{"teachers", 1}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 70 71 // run pipeline 72 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 73 if err != nil { 74 panic(err) 75 } 76 77 // print results 78 var results []bson.D 79 if err = cursor.All(context.TODO(), &results); err != nil { 80 panic(err) 81 } 82 for _, result := range results { 83 fmt.Println(result) 84 } 85 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
go run basic-embedded-documents-search.go
1 [ 2 {_id 1} 3 {teachers [[ 4 {first Jane} 5 {last Earwhacker} 6 {classes [[{subject art} {grade 9th}] [{subject science} {grade 12th}]]} 7 ] [ 8 {first John} 9 {last Smith} 10 {classes [[{subject math} {grade 12th}] [{subject art} {grade 10th}]]} 11 ]]} 12 {score 0.7830756902694702} 13 {highlights [[ 14 {score 1.4921371936798096} 15 {path teachers.last} 16 {texts [[{value Smith} {type hit}]]} 17 ]]} 18 ] 19 [ 20 {_id 2} 21 {teachers [[ 22 {first Jane} 23 {last Smith} 24 {classes [[{subject science} {grade 9th}] [{subject math} {grade 12th}]]} 25 ] [ 26 {first John} 27 {last Redman} 28 {classes [[{subject art} {grade 12th}]]} 29 ]]} 30 {score 0.468008816242218} 31 {highlights [[ 32 {score 1.4702850580215454} 33 {path teachers.last} 34 {texts [[{value Smith} {type hit}]]} 35 ]]} 36 ]
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
go run complex-embedded-documents-search.go
1 [ 2 {_id 2} 3 {name Lincoln High} 4 {clubs [ 5 {sports [ 6 [ 7 {club_name dodgeball} 8 {description provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.} 9 ] [ 10 {club_name martial arts} 11 {description provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.} 12 ] 13 ]} 14 ]} 15 {score 0.633669912815094} 16 ] 17 [ 18 {_id 1} 19 {name Evergreen High} 20 {clubs [ 21 {sports [ 22 [ 23 {club_name archery} 24 {description provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.} 25 ] [ 26 {club_name ultimate frisbee} 27 {description provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.} 28 ] 29 ]} 30 ]} 31 {score 0.481589138507843} 32 ]
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
go run nested-embedded-documents-search.go
1 [ 2 {_id 0} 3 {teachers [[ 4 {first Jane} 5 {last Smith} 6 {classes [[{subject art of science} {grade 12th}] [{subject applied science and practical science} {grade 9th}] [{subject remedial math} {grade 12th}] [{subject science} {grade 10th}]]} 7 ] [ 8 {first Bob} 9 {last Green} 10 {classes [[{subject science of art} {grade 11th}] [{subject art art art} {grade 10th}]]} 11 ]]} 12 {score 0.9415585994720459} 13 {highlights [[ 14 {score 0.7354040145874023} 15 {path teachers.classes.subject} 16 {texts [[{value art of } {type text}] [{value science} {type hit}]]} 17 ] [ 18 {score 0.7871346473693848} 19 {path teachers.classes.subject} 20 {texts [[{value applied } {type text}] [{value science} {type hit}] [{value and practical } {type text}] [{value science} {type hit}]]} 21 ] [ 22 {score 0.7581484317779541} 23 {path teachers.classes.subject} 24 {texts [[{value science} {type hit}]]} 25 ] [ 26 {score 0.7189631462097168} 27 {path teachers.classes.subject} 28 {texts [[{value science} {type hit}] [{value of art} {type text}]]} 29 ]]} 30 ] 31 [ 32 {_id 1} 33 {teachers [[ 34 {first Jane} 35 {last Earwhacker} 36 {classes [[{subject art} {grade 9th}] [{subject science} {grade 12th}]]} 37 ] [ 38 {first John} 39 {last Smith} 40 {classes [[{subject math} {grade 12th}] [{subject art} {grade 10th}]]} 41 ]]} 42 {score 0.7779859304428101} 43 {highlights [[ 44 {score 1.502043604850769} 45 {path teachers.classes.subject} 46 {texts [[{value science} {type hit}]]} 47 ]]} 48 ]
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
将 Atlas Search 查询代码复制并粘贴到相应文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class BasicEmbeddedDocumentsSearch { 14 public static void main( String[] args ) { 15 // define clauses 16 List<Document> mustClause = 17 List.of( 18 new Document( 19 "text", 20 new Document("path", "teachers.first") 21 .append("query", "John"))); 22 List<Document> shouldClause = 23 List.of( 24 new Document( 25 "text", 26 new Document("path", "teachers.last") 27 .append("query", "Smith"))); 28 29 // define query 30 Document agg = 31 new Document("$search", new Document("index", "embedded-documents-tutorial") 32 .append("embeddedDocument", 33 new Document("path", "teachers") 34 .append("operator", 35 new Document("compound", 36 new Document("must", mustClause) 37 .append("should", shouldClause)))) 38 .append("highlight", new Document("path", "teachers.last"))); 39 40 // specify connection 41 String uri = "<connection-string>"; 42 43 // establish connection and set namespace 44 try (MongoClient mongoClient = MongoClients.create(uri)) { 45 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 46 MongoCollection<Document> collection = database.getCollection("schools"); 47 48 // run query and print results 49 collection.aggregate(Arrays.asList(agg, 50 limit(5), 51 project(Document.parse("{score: {$meta: 'searchScore'}, _id: 0, teachers: 1, highlights: {$meta: 'searchHighlights'}}")))) 52 .forEach(doc -> System.out.println(doc.toJson())); 53 } 54 } 55 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 import java.util.Arrays; 2 import static com.mongodb.client.model.Aggregates.limit; 3 import static com.mongodb.client.model.Aggregates.project; 4 import static com.mongodb.client.model.Projections.computed; 5 import static com.mongodb.client.model.Projections.fields; 6 import static com.mongodb.client.model.Projections.include; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class ComplexEmbeddedDocumentQuery { 14 public static void main(String[] args) { 15 // connect to your Atlas cluster 16 String uri = "<connection-string>"; 17 18 try (MongoClient mongoClient = MongoClients.create(uri)) { 19 // set namespace 20 MongoDatabase database = mongoClient.getDatabase("my_test"); 21 MongoCollection<Document> collection = database.getCollection("schools"); 22 23 // define pipeline 24 Document agg = new Document("$search", 25 new Document("embeddedDocument", 26 new Document("path", "clubs.sports") 27 .append("operator", 28 new Document("queryString", 29 new Document("defaultPath", "clubs.sports.club_name") 30 .append("query", "dodgeball OR frisbee"))))); 31 32 // run pipeline and print results 33 collection.aggregate(Arrays.asList(agg, 34 limit(5), 35 project(fields( 36 include("name", "clubs.sports"), 37 computed("score", new Document("$meta", "searchScore")))))) 38 .forEach(doc -> System.out.println(doc.toJson())); 39 } 40 } 41 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import com.mongodb.client.MongoClient; 7 import com.mongodb.client.MongoClients; 8 import com.mongodb.client.MongoCollection; 9 import com.mongodb.client.MongoDatabase; 10 import org.bson.Document; 11 12 public class NestedEmbeddedDocumentsSearch { 13 public static void main( String[] args ) { 14 // define clauses 15 List<Document> nestedMustClause = 16 List.of( 17 new Document( 18 "text", 19 new Document("path", "teachers.classes.grade") 20 .append("query", "12th")), 21 new Document("text", 22 new Document("path", "teachers.classes.subject") 23 .append("query", "science"))); 24 List<Document> mustClause = 25 List.of( 26 new Document( 27 "embeddedDocument", 28 new Document("path", "teachers.classes") 29 .append("operator", new Document("compound", 30 new Document("must", nestedMustClause))))); 31 List<Document> shouldClause = 32 List.of( 33 new Document( 34 "text", 35 new Document("path", "teachers.last") 36 .append("query", "Smith"))); 37 38 // define query 39 Document agg = 40 new Document( 41 "$search", 42 new Document("index", "embedded-documents-tutorial") 43 .append("embeddedDocument", 44 new Document("path", "teachers") 45 .append("operator", 46 new Document("compound", 47 new Document("must", mustClause) 48 .append("should", shouldClause)))) 49 .append("highlight", new Document("path", "teachers.classes.subject"))); 50 51 // specify connection 52 String uri = "<connection-string>"; 53 54 // establish connection and set namespace 55 try (MongoClient mongoClient = MongoClients.create(uri)) { 56 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 57 MongoCollection<Document> collection = database.getCollection("schools"); 58 59 // run query and print results 60 collection.aggregate(Arrays.asList(agg, 61 limit(5), 62 project(Document.parse("{score: {$meta: 'searchScore'}, _id: 0, teachers: 1, highlights: {$meta: 'searchHighlights'}}")))) 63 .forEach(doc -> System.out.println(doc.toJson())); 64 } 65 } 66 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行 Java 文件。
javac BasicEmbeddedDocumentsSearch.java java BasicEmbeddedDocumentsSearch
1 { 2 "teachers": [{ 3 "first": "Jane", 4 "last": "Earwhacker", 5 "classes": [{ 6 {"subject": "art", "grade": "9th"}, 7 {"subject": "science", "grade": "12th"} 8 ] 9 }, { 10 "first": "John", 11 "last": "Smith", 12 "classes": [ 13 {"subject": "math", "grade": "12th"}, 14 {"subject": "art", "grade": "10th"} 15 ] 16 }], 17 "score": 0.7830756902694702, 18 "highlights": [{ 19 "score": 1.4921371936798096, 20 "path": "teachers.last", 21 "texts": [{"value": "Smith", "type": "hit"}] 22 }] 23 } 24 { 25 "teachers": [{ 26 "first": "Jane", 27 "last": "Smith", 28 "classes": [ 29 {"subject": "science", "grade": "9th"}, 30 {"subject": "math", "grade": "12th"} 31 ] 32 }, { 33 "first": "John", 34 "last": "Redman", 35 "classes": [ 36 {"subject": "art", "grade": "12th"} 37 ] 38 }], 39 "score": 0.468008816242218, 40 "highlights": [{ 41 "score": 1.4702850580215454, 42 "path": "teachers.last", 43 "texts": [{"value": "Smith", "type": "hit"}] 44 }] 45 }
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
javac ComplexEmbeddedDocumentQuery.java java ComplexEmbeddedDocumentQuery
1 { 2 "_id": 2, 3 "name": "Lincoln High", 4 "clubs": { 5 "sports": [ 6 {"club_name": "dodgeball", "description": "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves."}, 7 {"club_name": "martial arts", "description": "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons."} 8 ] 9 }, 10 "score": 0.633669912815094 11 } 12 { 13 "_id": 1, 14 "name": "Evergreen High", 15 "clubs": { 16 "sports": [ 17 {"club_name": "archery", "description": "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment."}, 18 {"club_name": "ultimate frisbee", "description": "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes."} 19 ] 20 }, 21 "score": 0.481589138507843 22 }
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
javac NestedEmbeddedDocumentsSearch.java java NestedEmbeddedDocumentsSearch
1 { 2 "teachers": [{ 3 "first": "Jane", 4 "last": "Smith", 5 "classes": [ 6 {"subject": "art of science", "grade": "12th"}, 7 {"subject": "applied science and practical science", "grade": "9th"}, 8 {"subject": "remedial math", "grade": "12th"}, 9 {"subject": "science", "grade": "10th"} 10 ] 11 }, { 12 "first": "Bob", 13 "last": "Green", 14 "classes": [ 15 {"subject": "science of art", "grade": "11th"}, 16 {"subject": "art art art", "grade": "10th"} 17 ] 18 }], 19 "score": 0.9415585994720459, 20 "highlights": [{ 21 "score": 0.7354040145874023, 22 "path": "teachers.classes.subject", 23 "texts": [ 24 {"value": "art of ", "type": "text"}, 25 {"value": "science", "type": "hit"} 26 ] 27 }, { 28 "score": 0.7871346473693848, 29 "path": "teachers.classes.subject", 30 "texts": [ 31 {"value": "applied ", "type": "text"}, 32 {"value": "science", "type": "hit"}, 33 {"value": " and practical ", "type": "text"}, 34 {"value": "science", "type": "hit"} 35 ] 36 }, { 37 "score": 0.7581484317779541, 38 "path": "teachers.classes.subject", 39 "texts": [ 40 {"value": "science", "type": "hit"} 41 ] 42 }, { 43 "score": 0.7189631462097168, 44 "path": "teachers.classes.subject", 45 "texts": [ 46 {"value": "science", "type": "hit"}, 47 {"value": " of art", "type": "text"} 48 ] 49 }] 50 } 51 { 52 "teachers": [{ 53 "first": "Jane", 54 "last": "Earwhacker", 55 "classes": [ 56 {"subject": "art", "grade": "9th"}, 57 {"subject": "science", "grade": "12th"} 58 ] 59 }, { 60 "first": "John", 61 "last": "Smith", 62 "classes": [ 63 {"subject": "math", "grade": "12th"}, 64 {"subject": "art", "grade": "10th"} 65 ] 66 }], 67 "score": 0.7779859304428101, 68 "highlights": [{ 69 "score": 1.502043604850769, 70 "path": "teachers.classes.subject", 71 "texts": [{"value": "science", "type": "hit"}] 72 }] 73 }
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
将 Atlas Search 查询代码复制并粘贴到相应文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("local_school_district") 13 val collection = database.getCollection<Document>("schools") 14 15 runBlocking { 16 // define clauses 17 val mustClauses = listOf( 18 Document( 19 "text", 20 Document("path", "teachers.first").append("query", "John") 21 ) 22 ) 23 24 val shouldClauses = listOf( 25 Document( 26 "text", 27 Document("path", "teachers.last") 28 .append("query", "Smith") 29 ) 30 ) 31 32 // define query 33 val agg = Document( 34 "\$search", Document("index", "embedded-documents-tutorial") 35 .append( 36 "embeddedDocument", 37 Document("path", "teachers") 38 .append( 39 "operator", 40 Document( 41 "compound", 42 Document("must", mustClauses) 43 .append("should", shouldClauses) 44 ) 45 ) 46 ) 47 .append("highlight", Document("path", "teachers.last")) 48 ) 49 50 // run query and print results 51 val resultsFlow = collection.aggregate<Document>( 52 listOf( 53 agg, 54 limit(5), 55 project(fields( 56 excludeId(), 57 include("teachers"), 58 computed("score", Document("\$meta", "searchScore")), 59 computed("highlights", Document("\$meta", "searchHighlights")) 60 )) 61 ) 62 ) 63 resultsFlow.collect { println(it) } 64 } 65 mongoClient.close() 66 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // connect to your Atlas cluster 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 13 // set namespace 14 val database = mongoClient.getDatabase("local_school_district") 15 val collection = database.getCollection<Document>("schools") 16 17 runBlocking { 18 // define pipeline 19 val agg = Document( 20 "\$search", 21 Document("index", "embedded-documents-tutorial") 22 .append("embeddedDocument", Document("path", "clubs.sports") 23 .append( 24 "operator", 25 Document( 26 "queryString", 27 Document("defaultPath", "clubs.sports.club_name") 28 .append("query", "dodgeball OR frisbee") 29 ) 30 ) 31 ) 32 ) 33 34 // run pipeline and print results 35 val resultsFlow = collection.aggregate<Document>( 36 listOf( 37 agg, 38 limit(5), 39 project( 40 fields( 41 include("name", "clubs.sports"), 42 computed("score", Document("\$meta", "searchScore")) 43 ) 44 ) 45 ) 46 ) 47 resultsFlow.collect { println(it) } 48 } 49 mongoClient.close() 50 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("local_school_district") 13 val collection = database.getCollection<Document>("schools") 14 15 runBlocking { 16 // define clauses 17 val nestedMustClauses = listOf( 18 Document("text", Document("path", "teachers.classes.grade") 19 .append("query", "12th")), 20 Document("text", Document("path", "teachers.classes.subject") 21 .append("query", "science")) 22 ) 23 24 val mustClauses = listOf( 25 Document( 26 "embeddedDocument", 27 Document("path", "teachers.classes") 28 .append( 29 "operator", Document( 30 "compound", 31 Document("must", nestedMustClauses) 32 ) 33 ) 34 ) 35 ) 36 37 val shouldClauses = listOf( 38 Document( 39 "text", 40 Document("path", "teachers.last") 41 .append("query", "Smith") 42 ) 43 ) 44 45 // define query 46 val agg = Document( 47 "\$search", 48 Document("index", "embedded-documents-tutorial") 49 .append( 50 "embeddedDocument", 51 Document("path", "teachers") 52 .append( 53 "operator", 54 Document( 55 "compound", 56 Document("must", mustClauses) 57 .append("should", shouldClauses) 58 ) 59 ) 60 ) 61 .append("highlight", Document("path", "teachers.classes.subject")) 62 ) 63 64 // run query and print results 65 val resultsFlow = collection.aggregate<Document>( 66 listOf( 67 agg, 68 limit(5), 69 project(fields( 70 excludeId(), 71 include("teachers"), 72 computed("score", Document("\$meta", "searchScore")), 73 computed("highlights", Document("\$meta", "searchHighlights")) 74 )) 75 ) 76 ) 77 resultsFlow.collect { println(it) } 78 } 79 mongoClient.close() 80 }
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行每个 Kotlin 文件。
当你在 IDE 中运行 BasicEmbeddedDocumentsSearch.kt
程序时,它会打印以下文档:
Document{{teachers=[Document{{first=Jane, last=Earwhacker, classes=[Document{{subject=art, grade=9th}}, Document{{subject=science, grade=12th}}]}}, Document{{first=John, last=Smith, classes=[Document{{subject=math, grade=12th}}, Document{{subject=art, grade=10th}}]}}], score=0.7830756902694702, highlights=[Document{{score=1.4921371936798096, path=teachers.last, texts=[Document{{value=Smith, type=hit}}]}}]}} Document{{teachers=[Document{{first=Jane, last=Smith, classes=[Document{{subject=science, grade=9th}}, Document{{subject=math, grade=12th}}]}}, Document{{first=John, last=Redman, classes=[Document{{subject=art, grade=12th}}]}}], score=0.468008816242218, highlights=[Document{{score=1.4702850580215454, path=teachers.last, texts=[Document{{value=Smith, type=hit}}]}}]}}
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
当你在 IDE 中运行 ComplexEmbeddedDocumentQuery.kt
程序时,它会打印以下文档:
Document{{_id=2, name=Lincoln High, clubs=Document{{sports=[Document{{club_name=dodgeball, description=provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.}}, Document{{club_name=martial arts, description=provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.}}]}}, score=0.633669912815094}} Document{{_id=1, name=Evergreen High, clubs=Document{{sports=[Document{{club_name=archery, description=provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.}}, Document{{club_name=ultimate frisbee, description=provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.}}]}}, score=0.481589138507843}}
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
当你在 IDE 中运行 NestedEmbeddedDocumentsSearch.kt
程序时,它会打印以下文档:
Document{{teachers=[Document{{first=Jane, last=Smith, classes=[Document{{subject=art of science, grade=12th}}, Document{{subject=applied science and practical science, grade=9th}}, Document{{subject=remedial math, grade=12th}}, Document{{subject=science, grade=10th}}]}}, Document{{first=Bob, last=Green, classes=[Document{{subject=science of art, grade=11th}}, Document{{subject=art art art, grade=10th}}]}}], score=0.9415585994720459, highlights=[Document{{score=0.7354040145874023, path=teachers.classes.subject, texts=[Document{{value=art of , type=text}}, Document{{value=science, type=hit}}]}}, Document{{score=0.7871346473693848, path=teachers.classes.subject, texts=[Document{{value=applied , type=text}}, Document{{value=science, type=hit}}, Document{{value= and practical , type=text}}, Document{{value=science, type=hit}}]}}, Document{{score=0.7581484317779541, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}]}}, Document{{score=0.7189631462097168, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}, Document{{value= of art, type=text}}]}}]}} Document{{teachers=[Document{{first=Jane, last=Earwhacker, classes=[Document{{subject=art, grade=9th}}, Document{{subject=science, grade=12th}}]}}, Document{{first=John, last=Smith, classes=[Document{{subject=math, grade=12th}}, Document{{subject=art, grade=10th}}]}}], score=0.7779859304428101, highlights=[Document{{score=1.502043604850769, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}]}}]}}
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
将查询代码复制并粘贴到相应文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 '$search': { 19 'index': 'embedded-documents-tutorial', 20 'embeddedDocument': { 21 'path': 'teachers', 22 'operator': { 23 'compound': { 24 'must': [ 25 { 26 'text': { 27 'path': 'teachers.first', 28 'query': 'John' 29 } 30 } 31 ], 32 'should': [ 33 { 34 'text': { 35 'path': 'teachers.last', 36 'query': 'Smith' 37 } 38 } 39 ] 40 } 41 } 42 }, 43 'highlight': { 44 'path': 'teachers.last' 45 } 46 } 47 }, { 48 '$project': { 49 '_id': 1, 50 'teachers': 1, 51 'score': { 52 '$meta': 'searchScore' 53 }, 54 'highlights': { 55 '$meta': 'searchHighlights' 56 } 57 } 58 } 59 ]; 60 61 // run pipeline 62 const result = coll.aggregate(agg); 63 64 // print results 65 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 66 } finally { 67 await client.close(); 68 } 69 } 70 run().catch(console.dir);
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 '$search': { 19 'index': 'embedded-documents-tutorial', 20 'embeddedDocument': { 21 'path': 'clubs.sports', 22 'operator': { 23 'queryString': { 24 'defaultPath': 'clubs.sports.club_name', 25 'query': 'dodgeball OR frisbee' 26 } 27 } 28 } 29 } 30 }, { 31 '$project': { 32 '_id': 1, 33 'name': 1, 34 'clubs.sports': 1, 35 'score': { 36 '$meta': 'searchScore' 37 } 38 } 39 } 40 ]; 41 42 // run pipeline 43 const result = coll.aggregate(agg); 44 45 // print results 46 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 47 } finally { 48 await client.close(); 49 } 50 } 51 run().catch(console.dir);
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 await client.connect(); 11 12 // set namespace 13 const database = client.db("local_school_district"); 14 const coll = database.collection("schools"); 15 16 // define pipeline 17 const agg = [ 18 { 19 '$search': { 20 'index': 'embedded-documents-tutorial', 21 'embeddedDocument': { 22 'path': 'teachers', 23 'operator': { 24 'compound': { 25 'must': [ 26 { 27 'embeddedDocument': { 28 'path': 'teachers.classes', 29 'operator': { 30 'compound': { 31 'must': [ 32 { 33 'text': { 34 'path': 'teachers.classes.grade', 35 'query': '12th' 36 } 37 }, { 38 'text': { 39 'path': 'teachers.classes.subject', 40 'query': 'science' 41 } 42 } 43 ] 44 } 45 } 46 } 47 } 48 ], 49 'should': [ 50 { 51 'text': { 52 'path': 'teachers.last', 53 'query': 'smith' 54 } 55 } 56 ] 57 } 58 } 59 }, 60 'highlight': { 61 'path': 'teachers.classes.subject' 62 } 63 } 64 }, { 65 '$project': { 66 '_id': 1, 67 'teachers': 1, 68 'score': { 69 '$meta': 'searchScore' 70 }, 71 'highlights': { 72 '$meta': 'searchHighlights' 73 } 74 } 75 } 76 ]; 77 78 // run pipeline 79 const result = coll.aggregate(agg); 80 81 // print results 82 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 83 } finally { 84 await client.close(); 85 } 86 } 87 run().catch(console.dir);
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
node basic-embedded-documents-query.js
1 { 2 "_id":1, 3 "teachers":[{ 4 "first":"Jane", 5 "last":"Earwhacker", 6 "classes":[{"subject":"art","grade":"9th"},{"subject":"science","grade":"12th"}] 7 },{ 8 "first":"John", 9 "last":"Smith", 10 "classes":[{"subject":"math","grade":"12th"},{"subject":"art","grade":"10th"}] 11 }], 12 "score":0.7830756902694702, 13 "highlights":[{ 14 "score":1.4921371936798096, 15 "path":"teachers.last", 16 "texts":[{"value":"Smith","type":"hit"}] 17 }] 18 } 19 { 20 "_id":2, 21 "teachers":[{ 22 "first":"Jane", 23 "last":"Smith", 24 "classes":[{"subject":"science","grade":"9th"},{"subject":"math","grade":"12th"}] 25 },{ 26 "first":"John", 27 "last":"Redman", 28 "classes":[{"subject":"art","grade":"12th"}] 29 }], 30 "score":0.468008816242218, 31 "highlights":[{ 32 "score":1.4702850580215454, 33 "path":"teachers.last", 34 "texts":[{"value":"Smith","type":"hit"}] 35 }] 36 }
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
node complex-embedded-documents-query.js
1 { 2 "_id":2, 3 "name":"Lincoln High", 4 "clubs":{ 5 "sports":[{ 6 "club_name":"dodgeball", 7 "description":"provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." 8 },{ 9 "club_name":"martial arts", 10 "description":"provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." 11 } 12 ]}, 13 "score":0.633669912815094 14 } 15 { 16 "_id":1, 17 "name":"Evergreen High", 18 "clubs":{ 19 "sports":[{ 20 "club_name":"archery", 21 "description":"provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." 22 },{ 23 "club_name":"ultimate frisbee", 24 "description":"provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." 25 }] 26 }, 27 "score":0.481589138507843 28 }
结果中的两个文件显示提供学生可以 dodgeball
或 frisbee
的俱乐部的学校。
node nested-embedded-documents-query.js
1 { 2 "_id":0, 3 "teachers":[{ 4 "first":"Jane", 5 "last":"Smith", 6 "classes":[{"subject":"art of science","grade":"12th"},{"subject":"applied science and practical science","grade":"9th"},{"subject":"remedial math","grade":"12th"},{"subject":"science","grade":"10th"}] 7 },{ 8 "first":"Bob", 9 "last":"Green", 10 "classes":[{"subject":"science of art","grade":"11th"},{"subject":"art art art","grade":"10th"}] 11 }], 12 "score":0.9415585994720459, 13 "highlights":[{ 14 "score":0.7354040145874023, 15 "path":"teachers.classes.subject", 16 "texts":[{"value":"art of ","type":"text"},{"value":"science","type":"hit"}] 17 },{ 18 "score":0.7871346473693848, 19 "path":"teachers.classes.subject", 20 "texts":[{"value":"applied ","type":"text"},{"value":"science","type":"hit"},{"value":" and practical ","type":"text"},{"value":"science","type":"hit"}] 21 },{ 22 "score":0.7581484317779541, 23 "path":"teachers.classes.subject", 24 "texts":[{"value":"science","type":"hit"}] 25 },{ 26 "score":0.7189631462097168, 27 "path":"teachers.classes.subject", 28 "texts":[{"value":"science","type":"hit"},{"value":" of art","type":"text"}] 29 }] 30 } 31 { 32 "_id":1, 33 "teachers":[{ 34 "first":"Jane", 35 "last":"Earwhacker", 36 "classes":[{"subject":"art","grade":"9th"},{"subject":"science","grade":"12th"}] 37 },{ 38 "first":"John", 39 "last":"Smith", 40 "classes":[{"subject":"math","grade":"12th"},{"subject":"art","grade":"10th"}] 41 }], 42 "score":0.7779859304428101, 43 "highlights":[{ 44 "score":1.502043604850769, 45 "path":"teachers.classes.subject", 46 "texts":[{"value":"science","type":"hit"}] 47 }] 48 }
结果中的两个文档包含教授 12th
年级 science
的教师。带有 _id: 0
的文档包含一位姓氏为 Smith
的教师,该教师教授 12th
年级的 science
。
将代码示例复制并粘贴到相应文件中。
要了解有关这些查询的更多信息,请参阅关于查询。
要了解有关此查询的更多信息,请参阅关于查询。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'teachers', 13 'operator': { 14 'compound': { 15 'must': [ 16 { 17 'text': { 18 'path': 'teachers.first', 19 'query': 'John' 20 } 21 } 22 ], 23 'should': [ 24 { 25 'text': { 26 'path': 'teachers.last', 27 'query': 'Smith' 28 } 29 } 30 ] 31 } 32 } 33 }, 34 'highlight': { 35 'path': 'teachers.last' 36 } 37 } 38 }, { 39 '$project': { 40 '_id': 1, 41 'teachers': 1, 42 'score': { 43 '$meta': 'searchScore' 44 }, 45 'highlights': { 46 '$meta': 'searchHighlights' 47 } 48 } 49 } 50 ] 51 52 # run pipeline 53 result = client['local_school_district']['schools'].aggregate(pipeline) 54 55 # print results 56 for i in result: 57 print(i)
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
要了解有关此查询的更多信息,请参阅关于查询。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'clubs.sports', 13 'operator': { 14 'queryString': { 15 'defaultPath': 'clubs.sports.club_name', 16 'query': 'dodgeball OR frisbee' 17 } 18 } 19 } 20 } 21 }, { 22 '$project': { 23 '_id': 1, 24 'name': 1, 25 'clubs.sports': 1, 26 'score': { 27 '$meta': 'searchScore' 28 } 29 } 30 } 31 ] 32 33 # run pipeline 34 result = client['local_school_district']['schools'].aggregate(pipeline) 35 36 # print results 37 for i in result: 38 print(i)
要了解有关此查询的更多信息,请参阅关于查询。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'teachers', 13 'operator': { 14 'compound': { 15 'must': [ 16 { 17 'embeddedDocument': { 18 'path': 'teachers.classes', 19 'operator': { 20 'compound': { 21 'must': [ 22 { 23 'text': { 24 'path': 'teachers.classes.grade', 25 'query': '12th' 26 } 27 }, { 28 'text': { 29 'path': 'teachers.classes.subject', 30 'query': 'science' 31 } 32 } 33 ] 34 } 35 } 36 } 37 } 38 ], 39 'should': [ 40 { 41 'text': { 42 'path': 'teachers.last', 43 'query': 'smith' 44 } 45 } 46 ] 47 } 48 } 49 }, 50 'highlight': { 51 'path': 'teachers.classes.subject' 52 } 53 } 54 }, { 55 '$project': { 56 '_id': 1, 57 'teachers': 1, 58 'score': { 59 '$meta': 'searchScore' 60 }, 61 'highlights': { 62 '$meta': 'searchHighlights' 63 } 64 } 65 } 66 ] 67 68 # run pipeline 69 result = client['local_school_district']['schools'].aggregate(pipeline) 70 71 # print results 72 for i in result: 73 print(i)
在运行示例之前,请将 <connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
python basic-embedded-documents-query.py
1 { 2 '_id': 1, 3 'teachers': [{ 4 'first': 'Jane', 5 'last': 'Earwhacker', 6 'classes': [{'subject': 'art', 'grade': '9th'}, {'subject': 'science', 'grade': '12th'}] 7 }, { 8 'first': 'John', 9 'last': 'Smith', 10 'classes': [{'subject': 'math', 'grade': '12th'}, {'subject': 'art', 'grade': '10th'}] 11 }], 12 'score': 0.7830756902694702, 13 'highlights': [{ 14 'score': 1.4921371936798096, 15 'path': 'teachers.last', 16 'texts': [{'value': 'Smith', 'type': 'hit'}] 17 }] 18 } 19 { 20 '_id': 2, 21 'teachers': [{ 22 'first': 'Jane', 23 'last': 'Smith', 24 'classes': [{'subject': 'science', 'grade': '9th'}, {'subject': 'math', 'grade': '12th'}] 25 }, { 26 'first': 'John', 27 'last': 'Redman', 28 'classes': [{'subject': 'art', 'grade': '12th'}] 29 }], 30 'score': 0.468008816242218, 31 'highlights': [{ 32 'score': 1.4702850580215454, 33 'path': 'teachers.last', 34 'texts': [{'value': 'Smith', 'type': 'hit'}] 35 }] 36 }
结果中的两个文档包含名字为 John
的教师。_id: 1
的文档排名较高,因为它包含一位名字为 John
且姓氏为 Smith
的教师。
python complex-embedded-documents-query.py
1 { 2 '_id': 2, 3 'name': 'Lincoln High', 4 'clubs': { 5 'sports': [{ 6 'club_name': 'dodgeball', 7 'description': 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 8 }, { 9 'club_name': 'martial arts', 10 'description': 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 11 }] 12 }, 13 'score': 0.633669912815094 14 } 15 { 16 '_id': 1, 17 'name': 'Evergreen High', 18 'clubs': { 19 'sports': [{ 20 'club_name': 'archery', 21 'description': 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 22 }, { 23 'club_name': 'ultimate frisbee', 'description': 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 24 }] 25 }, 26 'score': 0.481589138507843 27 }
python advanced-embedded-documents-query.py
1 { 2 '_id': 0, 3 'teachers': [{ 4 'first': 'Jane', 5 'last': 'Smith', 6 'classes': [{'subject': 'art of science', 'grade': '12th'}, {'subject': 'applied science and practical science', 'grade': '9th'}, {'subject': 'remedial math', 'grade': '12th'}, {'subject': 'science', 'grade': '10th'}] 7 }, { 8 'first': 'Bob', 9 'last': 'Green', 10 'classes': [{'subject': 'science of art', 'grade': '11th'}, {'subject': 'art art art', 'grade': '10th'}] 11 }], 12 'score': 0.9415585994720459, 13 'highlights': [{ 14 'score': 0.7354040145874023, 15 'path': 'teachers.classes.subject', 16 'texts': [{'value': 'art of ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}] 17 }, { 18 'score': 0.7871346473693848, 19 'path': 'teachers.classes.subject', 20 'texts': [{'value': 'applied ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}, {'value': ' and practical ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}] 21 }, { 22 'score': 0.7581484317779541, 23 'path': 'teachers.classes.subject', 24 'texts': [{'value': 'science', 'type': 'hit'}] 25 }, { 26 'score': 0.7189631462097168, 27 'path': 'teachers.classes.subject', 28 'texts': [{'value': 'science', 'type': 'hit'}, {'value': ' of art', 'type': 'text'}] 29 }] 30 } 31 { 32 '_id': 1, 33 'teachers': [{ 34 'first': 'Jane', 35 'last': 'Earwhacker', 36 'classes': [{'subject': 'art', 'grade': '9th'}, {'subject': 'science', 'grade': '12th'}] 37 }, { 38 'first': 'John', 39 'last': 'Smith', 40 'classes': [{'subject': 'math', 'grade': '12th'}, {'subject': 'art', 'grade': '10th'}] 41 }], 42 'score': 0.7779859304428101, 43 'highlights': [{ 44 'score': 1.502043604850769, 45 'path': 'teachers.classes.subject', 46 'texts': [{'value': 'science', 'type': 'hit'}] 47 }] 48 }
$searchMeta
对嵌入式文档字段运行 查询
您可以对嵌入式文档字段运行$searchMeta
查询。 在本部分中,您将连接到 Atlas 集群,并使用$searchMeta
阶段和分面对嵌入式文档字段运行示例查询。
在Atlas中,转到项目的Clusters 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未显示,请单击侧边栏中的Clusters 。
会显示集群页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击 Services 标题下的 Atlas Search。
从 Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search。
将显示 Atlas Search 页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击该集合的 Search Indexes 标签页。
将显示 Atlas Search 页面。
单击集群的名称。
单击 Atlas Search 标签页。
将显示 Atlas Search 页面。
使用embeddedDocument
操作符对 集合运行Atlas Search查询。schools
该查询查找高中,并要求统计开设各年级课程的学校数量。
将以下查询复制并粘贴到 Query Editor 中,然后点击 Query Editor 中的 Search 按钮。
1 [ 2 { 3 "$searchMeta": { 4 "index": "embedded-documents-tutorial", 5 "facet": { 6 "operator": { 7 "text":{ 8 "path": "name", 9 "query": "High" 10 } 11 }, 12 "facets": { 13 "gradeFacet": { 14 "type": "string", 15 "path": "teachers.classes.grade" 16 } 17 } 18 } 19 } 20 } 21 ]
count: Object lowerBound: 3 facet: Object gradeFacet: Object buckets: Array (4) 0: Object _id: "12th" count: 3 1: Object _id: "9th" count : 3 2: Object _id: "10th" count: 2 3: Object _id: "11th" count: 1
使用mongosh
连接到您的集群。
在终端窗口中打开mongosh
并连接到集群。 有关连接的详细说明,请参阅通过mongosh
连接。
使用local_school
数据库。
在 mongosh
提示符下运行以下命令:
use local_school_district
switched to db local_school_district
针对 集合运行以下Atlas Search查询。schools
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 db.schools.aggregate({ 2 "$searchMeta": { 3 "index": "embedded-documents-tutorial", 4 "facet": { 5 "operator": { 6 "text":{ 7 "path": "name", 8 "query": "High" 9 } 10 }, 11 "facets": { 12 "gradeFacet": { 13 "type": "string", 14 "path": "teachers.classes.grade" 15 } 16 } 17 } 18 } 19 })
1 [ 2 { 3 count: { lowerBound: Long('3') }, 4 facet: { 5 gradeFacet: { 6 buckets: [ 7 { _id: '12th', count: Long('3') }, 8 { _id: '9th', count: Long('3') }, 9 { _id: '10th', count: Long('2') }, 10 { _id: '11th', count: Long('1') } 11 ] 12 } 13 } 14 } 15 ]
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
在 MongoDB Compass 中连接到您的集群。
打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。
针对 集合运行以下Atlasschools
Search查询。
该查询查找高中,并要求统计开设各年级课程的学校数量。
管道阶段 | 查询 | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$searchMeta |
MongoDB Compass 显示以下结果:
结果表明, |
将查询复制并粘贴到Program.cs
文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 6 public class EmbeddedDocumentsFacetExample 7 { 8 private const string MongoConnectionString = "<connection-string>"; 9 10 public static void Main(string[] args) 11 { 12 // allow automapping of the camelCase database fields to our MovieDocument 13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 15 16 // connect to your Atlas cluster 17 var mongoClient = new MongoClient(MongoConnectionString); 18 var districtDatabase = mongoClient.GetDatabase("local_school_district"); 19 var schoolCollection = districtDatabase.GetCollection<SchoolDocument>("schools"); 20 21 // define and run pipeline 22 var results = schoolCollection.Aggregate() 23 .SearchMeta(Builders<SchoolDocument>.Search.Facet( 24 Builders<SchoolDocument>.Search.Text(school => school.Name, "High"), 25 Builders<SchoolDocument>.SearchFacet.String("gradeFacet", "teachers.classes.grade")), 26 indexName: "embedded-documents-tutorial") 27 .Single(); 28 29 // print results 30 Console.WriteLine(results.ToJson()); 31 } 32 } 33 34 [ ]35 public class SchoolDocument 36 { 37 public int Id { get; set; } 38 public string Name { get; set; } 39 public TeacherDocument[] Teachers { get; set; } 40 } 41 [ ]42 public class TeacherDocument 43 { 44 public ClassDocument[] Classes { get; set; } 45 } 46 [ ]47 public class ClassDocument 48 { 49 public string Grade { get; set; } 50 }
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行Program.cs
文件。
dotnet run embedded-documents-facet-query.csproj
{ "count" : { "lowerBound" : NumberLong(3), "total" : null }, "facet" : { "gradeFacet" : { "buckets" : [ { "_id" : "12th", "count" : NumberLong(3) }, { "_id" : "9th", "count" : NumberLong(3) }, { "_id" : "10th", "count" : NumberLong(2) }, { "_id" : "11th", "count" : NumberLong(1) } ] } } }
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
将示例查询复制并粘贴到embedded-documents-facet-query
文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$searchMeta", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "facet": bson.M{ 27 "operator": bson.M{ 28 "text": bson.M{ 29 "path": "name", 30 "query": "High"}, 31 }, 32 "facets": bson.M{ 33 "gradeFacet": bson.M{ 34 "path": "teachers.classes.grade", 35 "type": "string"}, 36 }}}}} 37 38 // run pipeline 39 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage}) 40 if err != nil { 41 panic(err) 42 } 43 44 // print results 45 var results []bson.D 46 if err = cursor.All(context.TODO(), &results); err != nil { 47 panic(err) 48 } 49 for _, result := range results { 50 fmt.Println(result) 51 } 52 }
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
go run embedded-documents-facet-query.go
1 [ 2 {count [{lowerBound 3}]} 3 {facet [ 4 {gradeFacet [ 5 {buckets [ 6 [{_id 12th} {count 3}] 7 [{_id 9th} {count 3}] 8 [{_id 10th} {count 2}] 9 [{_id 11th} {count 1}] 10 ]} 11 ]} 12 ]} 13 ]
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
将Atlas Search查询的代码复制并粘贴到FacetEmbeddedDocumentsSearch.java
文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 import com.mongodb.client.MongoClient; 2 import com.mongodb.client.MongoClients; 3 import com.mongodb.client.MongoCollection; 4 import com.mongodb.client.MongoDatabase; 5 import org.bson.Document; 6 import java.util.Arrays; 7 8 public class FacetEmbeddedDocumentsSearch { 9 public static void main(String[] args) { 10 // connect to your Atlas cluster 11 String uri = "<connection-string>"; 12 try (MongoClient mongoClient = MongoClients.create(uri)) { 13 // set namespace 14 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 15 MongoCollection<Document> collection = database.getCollection("schools"); 16 17 // define pipeline 18 Document agg = new Document("$searchMeta", 19 new Document( "index", "embedded-documents-tutorial") 20 .append("facet", 21 new Document("operator", 22 new Document("text", 23 new Document("path", "name") 24 .append("query", "High"))) 25 .append("facets", 26 new Document("gradeFacet", 27 new Document("type", "string").append("path", "teachers.classes.grade")) 28 ))); 29 // run pipeline and print results 30 collection.aggregate(Arrays.asList(agg)) 31 .forEach(doc -> System.out.println(doc.toJson())); 32 } 33 } 34 }
注意
要在 Maven 环境中运行示例代码,请将以下代码添加到文件中的 import 语句上方。
package com.mongodb.drivers;
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行 Java 文件。
javac FacetEmbeddedDocumentsSearch.java java FacetEmbeddedDocumentsSearch
1 { 2 "count": {"lowerBound": 3}, 3 "facet": { 4 "gradeFacet": { 5 "buckets": [ 6 {"_id": "12th", "count": 3}, 7 {"_id": "9th", "count": 3}, 8 {"_id": "10th", "count": 2}, 9 {"_id": "11th", "count": 1} 10 ] 11 } 12 } 13 }
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
确保将以下依赖项添加到项目中。
MongoDB
mongodb-driver-kotlin-coroutine 如需了解更多信息,请参阅添加 MongoDB 作为依赖项。
序列化库
bson-kotlinx 要了解更多信息,请参阅添加序列化库依赖项。
将查询复制并粘贴到EmbeddedDocumentsFacetQuery.kt
文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 import com.mongodb.kotlin.client.coroutine.MongoClient 2 import kotlinx.coroutines.runBlocking 3 import org.bson.Document 4 5 fun main() { 6 // establish connection and set namespace 7 val uri = "<connection-string>" 8 val mongoClient = MongoClient.create(uri) 9 val database = mongoClient.getDatabase("local_school_district") 10 val collection = database.getCollection<Document>("schools") 11 12 runBlocking { 13 14 // define query 15 val agg = Document( 16 "\$searchMeta", 17 Document("index", "embedded-documents-tutorial") 18 .append("facet", 19 Document( 20 "operator", 21 Document( 22 "text", 23 Document("path", "name") 24 .append("query", "High") 25 ) 26 ) 27 .append( 28 "facets", 29 Document( 30 "gradeFacet", 31 Document("type", "string").append("path", "teachers.classes.grade") 32 ) 33 ) 34 ) 35 ) 36 37 // run query and print results 38 val resultsFlow = collection.aggregate<Document>(listOf(agg)) 39 resultsFlow.collect { println(it) } 40 } 41 mongoClient.close() 42 }
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行EmbeddedDocumentsFacetQuery.kt
文件。
当你在 IDE 中运行 EmbeddedDocumentsFacetQuery.kt
程序时,它会打印以下文档:
Document{{ count=Document{{lowerBound=3}}, facet=Document{{ gradeFacet=Document{{ buckets=[ Document{{_id=12th, count=3}}, Document{{_id=9th, count=3}}, Document{{_id=10th, count=2}}, Document{{_id=11th, count=1}} ] }} }} }}
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
embedded-documents-facet-query.js
将查询代码复制并粘贴到 文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 "$searchMeta": { 19 "index": "embedded-documents-tutorial", 20 "facet": { 21 "operator": { 22 "text":{ 23 "path": "name", 24 "query": "High" 25 } 26 }, 27 "facets": { 28 "gradeFacet": { 29 "type": "string", 30 "path": "teachers.classes.grade" 31 } 32 } 33 } 34 } 35 } 36 ]; 37 38 // run pipeline 39 const result = coll.aggregate(agg); 40 41 // print results 42 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 43 } finally { 44 await client.close(); 45 } 46 } 47 run().catch(console.dir);
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
node embedded-documents-facet-query.js
1 { 2 "count":{"lowerBound":3}, 3 "facet":{ 4 "gradeFacet":{ 5 "buckets":[ 6 {"_id":"12th","count":3}, 7 {"_id":"9th","count":3}, 8 {"_id":"10th","count":2}, 9 {"_id":"11th","count":1} 10 ] 11 } 12 } 13 }
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。
将代码示例复制并粘贴到embedded-documents-facet-query.py
文件中。
该查询查找高中,并要求统计开设各年级课程的学校数量。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [{"$searchMeta": { 8 "index": "embedded-documents-tutorial", 9 "facet": { 10 "operator": { 11 "text": {"path": "name", "query": 'High'} 12 }, 13 "facets": { 14 "gradeFacet": {"type": "string", "path": "teachers.classes.grade"} 15 } 16 } 17 }}] 18 19 # run pipeline 20 result = client["local_school_district"]["schools"].aggregate(pipeline) 21 22 # print results 23 for i in result: 24 print(i)
替换查询中的<connection-string>
,然后保存文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行以下命令来查询您的集合:
python embedded-documents-facet-query.py
1 { 2 'count': {'lowerBound': 3}, 3 'facet': { 4 'gradeFacet': { 5 'buckets': [ 6 {'_id': '12th', 'count': 3}, 7 {'_id': '9th', 'count': 3}, 8 {'_id': '10th', 'count': 2}, 9 {'_id': '11th', 'count': 1} 10 ] 11 } 12 } 13 }
结果表明,3
学校提供 12th
年级和 9th
年级的课程,2
学校提供 10th
年级的课程,1
学校提供 11th
年级的课程。通过嵌入式文档中的字段进行分面时,查询会返回顶层父文档的计数,即该查询的 teachers
字段。