如何在MongoDB Atlas Search中跨根与嵌入文档执行Compound/Must查询?
MongoDB Atlas Search 跨根文档与嵌入文档的Compound/Must查询实现
需求
实现跨根文档和嵌入文档的Compound/Must查询,要求在所有可搜索字段中同时匹配“Big”和“Piano”,二者必须同时存在,目标返回_id为“101”的文档(该文档中“Big”位于根字段PublisherName,“Piano”位于嵌入字段Books.Title)。
示例文档
{ "_id": "101", "PublisherName": "Big book publishers", "PublisherAddress": "123 Mian Street", "Books": [ { "_id": "6791913210", "Title": "Piano made simple", "Author": "John Bent" }, { "_id": "6638200210", "Title": "Guitar made simple", "Author": "Kim Larry" } ] }
搜索索引配置
{ "mappings": { "dynamic": false, "fields": { "Books": { "dynamic": false, "fields": { "Author": { "analyzer": "lucene.standard", "type": "string" }, "Title": { "analyzer": "lucene.standard", "type": "string" } }, "type": "embeddedDocuments" }, "PublisherAddress": { "analyzer": "lucene.standard", "type": "string" }, "PublisherName": { "analyzer": "lucene.standard", "type": "string" } } } }
无效查询问题分析
当前查询的核心错误在于:
- 强制要求根字段
PublisherName/PublisherAddress同时包含“Big”和“Piano”,但目标文档根字段无“Piano”; - 嵌入文档查询部分要求单个
Books子文档同时包含“Big”和“Piano”,但目标文档的子文档分别只含其中一个词,无法匹配。
无效查询语句:
[ { "$search": { "index": "default", "compound": { "must": [ { "text": { "query": "Big", "path": [ "PublisherName", "PublisherAddress" ] } }, { "text": { "query": "Piano", "path": [ "PublisherName", "PublisherAddress" ] } }, { "embeddedDocument": { "operator": { "text": { "query": "Big", "path": [ "Books.Title", "Books.Author" ] }, "text": { "query": "Piano", "path": [ "Books.Title", "Books.Author" ] } }, "path": "Books" } } ] } } } ]
正确查询方案
只需在compound.must中定义两个独立的text查询,分别匹配“Big”和“Piano”,并将路径覆盖所有可搜索的根字段和嵌入字段即可。该查询会检查整个文档(含根和所有嵌入子文档)是否同时存在两个关键词,完全符合需求。
通用匹配方案(覆盖所有可搜索字段)
[ { "$search": { "index": "default", "compound": { "must": [ { "text": { "query": "Big", "path": ["PublisherName", "PublisherAddress", "Books.Title", "Books.Author"] } }, { "text": { "query": "Piano", "path": ["PublisherName", "PublisherAddress", "Books.Title", "Books.Author"] } } ] } } } ]
精准匹配方案(限定关键词出现范围)
如果明确知道“Big”仅出现在根字段、“Piano”仅出现在嵌入字段,可分别指定路径以提升查询效率:
[ { "$search": { "index": "default", "compound": { "must": [ { "text": { "query": "Big", "path": ["PublisherName", "PublisherAddress"] } }, { "text": { "query": "Piano", "path": ["Books.Title", "Books.Author"] } } ] } } } ]
内容的提问来源于stack exchange,提问作者O'Neil Tomlinson
相关产品推荐
相关产品推荐

