如何使用Atlas Search Compound Must聚合检索根文档与嵌入文档字段
问题场景
示例文档:
{ "_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" } ] }
需求:返回同时满足以下两个条件的文档:
- 根文档的
PublisherName字段包含"Big" - 嵌入文档
Books的Title字段包含"Piano"
原有错误查询无法返回目标文档:
{ "$search": { "index": "my-book-Index", "compound": { "must": [ { "text": { "query": "Big", "path": [ "PublisherName", "PublisherAddress" ] } }, { "text": { "query": "Piano", "path": [ "PublisherName", "PublisherAddress" ] } }, { "embeddedDocument": { "operator": { "compound": { "must": [ { "text": { "query": "Big", "path": [ "Books.Title", "Books.Author" ] } }, { "text": { "query": "Piano", "path": [ "Books.Title", "Books.Author" ] } } ] } }, "path": "Books" } } ] } } }
错误原因
- 额外添加了针对根字段
PublisherName/PublisherAddress的"Piano"查询,这两个字段不包含"Piano",直接导致查询无结果 - 嵌入文档查询里错误加入了"Big"的条件,嵌入文档的
Title/Author字段不存在"Big",不符合需求逻辑
正确聚合语句
{ "$search": { "index": "my-book-Index", "compound": { "must": [ // 根文档条件:PublisherName包含"Big" { "text": { "query": "Big", "path": "PublisherName" } }, // 嵌入文档条件:Books数组中存在Title包含"Piano"的元素 { "embeddedDocument": { "operator": { "text": { "query": "Piano", "path": "Books.Title" } }, "path": "Books" } } ] } } }
说明
- 根字段查询直接指定
PublisherName作为路径,精准匹配需求,避免不必要的字段扫描 - 嵌入文档查询中,
embeddedDocument的path指定为Books,内部的text查询精准定位Books.Title字段,确保只检查图书标题中是否包含"Piano" - 外层
compound的must数组确保两个条件同时满足,符合需求的"与"逻辑
内容的提问来源于stack exchange,提问作者O'Neil Tomlinson
相关产品推荐
相关产品推荐

