UPDATE 1:
This is the closest I've gotten so far:
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "campaignActivity",
"query": {
"bool": {
"filter": [
{
"term": {
"campaignActivity.event.keyword": "received"
}
},
{
"terms": {
"campaignActivity.campaignId.keyword": [
"c4",
"c3",
"c2"
]
}
}
]
}
}
}
}
],
"should": [
{
"nested": {
"path": "campaignActivity",
"query": {
"bool": {
"must_not": [
{
"term": {
"campaignActivity.campaignId.keyword": "c4"
}
},
{
"term": {
"campaignActivity.event.keyword": "received"
}
}
]
}
}
}
},
{
"nested": {
"path": "campaignActivity",
"query": {
"bool": {
"must_not": [
{
"term": {
"campaignActivity.campaignId.keyword": "c3"
}
},
{
"term": {
"campaignActivity.event.keyword": "received"
}
}
]
}
}
}
},
{
"nested": {
"path": "campaignActivity",
"query": {
"bool": {
"must_not": [
{
"term": {
"campaignActivity.campaignId.keyword": "c2"
}
},
{
"term": {
"campaignActivity.event.keyword": "received"
}
}
]
}
}
}
}
]
}
},
"from": 0,
"size": 10
}
But it still returns nm1@example.com which shouldn't be part of the result because it received all of the campaigns (c2,c3,c4) and is missing m1@example.com.