I believe you are after something like that:
GET wineries_development/_search
{
"query": {
"match_all": {}
},
"size": 0,
"from": 0,
"timeout": "11s",
"_source": false,
"post_filter": {
"nested": {
"path": "wines",
"query": {
"bool": {
"must": [
{
"range": {
"wines.scores": {
"gte": 100
}
}
},
{
"range": {
"wines.price": {
"lt": 3100
}
}
}
]
}
}
}
},
"aggregations": {
"wines": {
"nested": {
"path": "wines"
},
"aggregations": {
"wines.price": {
"filter": {
"range": {
"wines.scores": {
"gte": 100
}
}
},
"aggs": {
"price": {
"range": {
"field": "wines.price",
"keyed": true,
"ranges": [
{
"to": 3100,
"key": "<30"
},
{
"from": 3100,
"to": 5100,
"key": "31-51"
},
{
"from": 5100,
"to": 10100,
"key": "51-101"
},
{
"from": 10100,
"to": 25100,
"key": "101-251"
},
{
"from": 25100,
"key": "251+"
}
]
}
}
}
}
},
"wines.scores": {
"filter": {
"range": {
"wines.price": {
"lt": 3100
}
}
},
"aggs": {
"scores": {
"range": {
"field": "wines.scores",
"keyed": true,
"ranges": [
{
"from": 100,
"key": "100"
},
{
"from": 97,
"to": 100,
"key": "97-99"
},
{
"from": 94,
"to": 97,
"key": "94-96"
},
{
"from": 91,
"to": 94,
"key": "91-93"
},
{
"to": 91,
"key": "<90"
}
]
}
}
}
}
}
}
}
Putting the nested aggregation at the top makes your aggregation work at the nested level rather than the top level.