Atlas Search中如何对两个数值字段设置文档级而非数组级查询条件
解决方案
你遇到的问题是因为Atlas Search默认会打平数组字段的内容,直接用EQUALS和RANGE会跨数组元素匹配条件,无法保证两个条件命中同一个数组内的嵌套对象。你需要使用embeddedDocument运算符实现同一份嵌套文档的多条件匹配。
步骤1:调整搜索索引配置
首先确保你的Atlas搜索索引中,pw字段的类型配置为embeddedDocuments,示例索引配置片段如下:
{ "mappings": { "dynamic": false, "fields": { "pw": { "type": "embeddedDocuments", "fields": { "id": { "type": "number" }, "qty": { "type": "number" } } } } } }
步骤2:编写对应查询语句
使用embeddedDocument运算符包裹数组内的多条件,保证条件匹配同一个嵌套文档:
db.collection.aggregate([ { $search: { "index": "替换为你的搜索索引名称", "embeddedDocument": { "path": "pw", "operator": { "compound": { "must": [ { "equals": { "path": "pw.id", "value": 123 } }, { "range": { "path": "pw.qty", "gt": 5 } } ] } } } } } ])
补充说明
embeddedDocument运算符只会返回数组中存在至少一个满足所有嵌套条件的元素的父文档,符合你需要的文档级返回要求。- 嵌套条件内的路径需要写完整的层级路径,比如
pw.id而非直接写id。
内容的提问来源于stack exchange,提问作者Prem Parmar
相关产品推荐
相关产品推荐

