定义
embeddedDocumentembeddedDocument操作符与$elemMatch操作符类似。它限定嵌入式文档数组的单个元素满足多个查询谓词。embeddedDocument只能用于对 embeddedDocuments 类型字段的查询。
语法
embeddedDocument 通过以下语法实现:
{ "embeddedDocument": { "path": "<path-to-field>", "operator": { <operator-specification> }, "score": { <score-options> } }}选项
embeddedDocument 使用以下选项构建查询:
字段 | 类型 | 说明 | 必要性 |
|---|---|---|---|
| 对象 | 用于查询您在 | 必需 |
| 字符串 | 要搜索的索引 embeddedDocuments 类型字段。指定的字段必须是使用 | 必需 |
| 对象 | Optional |
embeddedDocument 操作符限制
您无法突出显示 embeddedDocument 操作符中的查询。
注意
MongoDB Search 停止在副本集或单个分片上复制大于每个分区 2、100、000、000索引对象的索引更改,其中每个带索引的嵌入式父文档都算作单个对象。超过此限制可能会导致查询结果过时。
使用 embeddedDocuments 字段类型可能会导致索引对象超过此索引大小限制,因为每个被索引的嵌入式文档都会被计为单个对象。如果您创建的 MongoDB Search 索引已有或即将有超过 2.1 亿个索引对象,请使用 numPartitions 索引选项对索引进行分区(仅在搜索节点部署上支持)或 对集群进行分片。
行为
当您使用 embeddedDocument操作符查询数组中的嵌入式文档时, MongoDB Search 会在查询执行的不同阶段对查询操作符查询谓词进行评估和评分。MongoDB搜索:
独立评估数组中的每个嵌入式文档。
如果通过 compound 指定了其他查询谓词,则将匹配结果与父文档连接在一起。
评分行为
默认情况下,embeddedDocument 操作符使用默认聚合策略 (sum) 合并嵌入式文档匹配的分数。embeddedDocument 操作符 score 选项允许您覆盖默认值,并使用 embedded 选项配置匹配结果的分数。
排序行为
要按嵌入式文档字段对父文档进行排序,必须执行以下操作:
将嵌入式文档子字段的父项索引为文档类型。
MongoDB Search 仅对父文档进行排序。它不会对文档大量中的子字段进行排序。有关示例,请参阅排序示例。
分面(Facet)行为
若要仅对 embeddedDocuments 数组中与您的查询匹配的子文档进行分面(Facet),请在分面(Facet)定义中添加一个匹配的 embeddedDocument 块,此外还要在查询的 operator 中使用 embeddedDocument。如果您在分面(Facet)定义中省略了 embeddedDocument 块,MongoDB Search 将对数组中的所有子文档进行分面(Facet),而不仅仅是与您的查询匹配的子文档。要了解更多信息,请参阅 对嵌入式文档数组的匹配子项进行分面(Facet)。
突出显示
对于在 embeddedDocument 操作符中指定的查询谓词,如果字段根据 document 类型的父字段进行索引,您可以突出显示这些字段。有关示例,请参阅教程。
要学习;了解embeddedDocument操作符符限制,请参阅 embeddedDocument 操作符限制。
示例
以下示例使用示例数据集中的 sample_supplies.sales 集合。
索引定义
这些示例查询对集合使用以下索引定义:
{ "mappings": { "dynamic": true, "fields": { "items": [ { "dynamic": true, "type": "embeddedDocuments" }, { "dynamic": true, "fields": { "tags": { "type": "token" } }, "type": "document" } ], "purchaseMethod": { "type": "token" } } }}基本查询
以下查询在集合中搜索带有 school 标签的项目,并优先搜索名为 backpack 的项目。MongoDB Search 根据所有匹配嵌入式文档的平均分数(算术平均值)按降序对结果进行评分。该查询包括一个用于将输出限制为 5 个文档的 $limit 阶段和一个用于执行以下操作的 $project 阶段:
排除
items.name和items.tags字段以外的所有字段添加字段
score
db.sales.aggregate({ "$search": { "embeddedDocument": { "path": "items", "operator": { "compound": { "must": [{ "text": { "path": "items.tags", "query": "school" } }], "should": [{ "text": { "path": "items.name", "query": "backpack" } }] } }, "score": { "embedded": { "aggregate": "mean" } } } }},{ $limit: 5},{ $project: { "_id": 0, "items.name": 1, "items.tags": 1, "score": { $meta: "searchScore" } }})分面查询
以下查询搜索标记为 school 且优先搜索名为 backpack 的项目。它请求有关 purchaseMethod 字段的分面信息。
db.sales.aggregate({ "$searchMeta": { "facet": { "operator": { "embeddedDocument": { "path": "items", "operator": { "compound": { "must": [ { "text": { "path": "items.tags", "query": "school" } } ], "should": [ { "text": { "path": "items.name", "query": "backpack" } } ] } } } }, "facets": { "purchaseMethodFacet": { "type": "string", "path": "purchaseMethod" } } } }})查询和排序
以下查询搜索名为 laptop 的项目,并按 items.tags 字段对结果进行排序。该查询包括一个 $limit 阶段,用于将输出限制为 5 个文档,以及一个 $project 阶段,用于:
排除
items.name和items.tags之外的所有字段添加字段
score
db.sales.aggregate({ "$search": { "embeddedDocument": { "path": "items", "operator": { "text": { "path": "items.name", "query": "laptop" } } }, "sort": { "items.tags": 1 } }},{ "$limit": 5},{ "$project": { "_id": 0, "items.name": 1, "items.tags": 1, "score": { "$meta": "searchScore" } }})仅查询匹配的嵌入式文档
以下查询仅返回与查询匹配的嵌套文档。该查询在 阶段使用MongoDB Search复合运算符符子句查找匹配的文档,然后在 $search$project阶段使用聚合操作符仅返回匹配的嵌入式文档。具体来说,该查询指定了以下管道阶段:
在复合操作符
| |
将输出限制为 | |
db.sales.aggregate( { "$search": { "embeddedDocument": { "path": "items", "operator": { "compound": { "must": [ { "range": { "path": "items.quantity", "gt": 2 } }, { "exists": { "path": "items.price" } }, { "text": { "path": "items.tags", "query": "school" } } ] } } } } }, { "$limit": 2 }, { "$project": { "_id": 0, "storeLocation": 1, "items": { "$filter": { "input": "$items", "cond": { "$and": [ { "$ifNull": [ "$$this.price", "false" ] }, { "$gt": [ "$$this.quantity", 2 ] }, { "$in": [ "office", "$$this.tags" ] } ] } } } } })了解详情
要学习;了解更多信息,请参阅如何对嵌入式文档中的字段运行MongoDB搜索查询。