I want to create an index on qualityConfirmations attribute and query it. As qualityConfirmations has dynamic fields at the root level for eg. 228, 234, and inside that I need to query for “qualityConfirmation.qualityConfirmationComment”, “qualityConfirmation.inspectDate” and other fields.
{
"_id": "4fa10c9b-099b-4269-92c9-ed22095f80c5",
"qualityConfirmations": {
"228": {
"qualityConfirmation": {
"delayGroupCode": "05",
"estimatedDelayDays": 42,
"inspectDate": {
"$date": "2022-04-26T00:00:00.000Z"
},
"qualityConfirmationCode": "R",
"qualityConfirmationComment": "QUALITY CONFIRMATION ACTIVITIES",
"qualityConfirmationDescription": "RELEASED",
"qualityConfirmationYear": 2022,
"repairDate": {
"$date": "2022-05-13T00:00:00.000Z"
},
"stopSaleNumber": "228"
}
},
"234": {
"qualityConfirmation": {
"delayGroupCode": "40",
"estimatedDelayDays": 294,
"inspectDate": {
"$date": "2022-05-26T00:00:00.000Z"
},
"qualityConfirmationCode": "R",
"qualityConfirmationComment": "QUALITY CONFIRMATION ACTIVITY",
"qualityConfirmationDescription": "RELEASED",
"qualityConfirmationYear": 2022,
"repairDate": {
"$date": "2022-09-23T00:00:00.000Z"
},
"stopSaleNumber": "234"
}
}
}
},
{
"_id": "4fa10c9b-099b-4269-92c9-ed22095f80c6",
"qualityConfirmations": {
"237": {
"qualityConfirmation": {
"delayGroupCode": "39",
"estimatedDelayDays": 287,
"inspectDate": {
"$date": "2022-06-02T00:00:00.000Z"
},
"qualityConfirmationCode": "R",
"qualityConfirmationComment": "QUALITY CONFIRMATION ACTIVITY",
"qualityConfirmationDescription": "RELEASED",
"qualityConfirmationYear": 2022,
"repairDate": {
"$date": "2022-11-07T00:00:00.000Z"
},
"stopSaleNumber": "237"
}
},
"246": {
"qualityConfirmation": {
"delayGroupCode": "34",
"estimatedDelayDays": 252,
"inspectDate": {
"$date": "2022-07-19T00:00:00.000Z"
},
"qualityConfirmationCode": "R",
"qualityConfirmationComment": "QUALITY CONFIRMATION ACTIVITY",
"qualityConfirmationDescription": "RELEASED",
"qualityConfirmationYear": 2022,
"repairDate": {
"$date": "2022-09-23T00:00:00.000Z"
},
"stopSaleNumber": "246"
}
}
}
},
{
"_id": "4fa10c9b-099b-4269-92c9-ed22095f80c7",
"qualityConfirmations": {
"265": {
"qualityConfirmation": {
"delayGroupCode": "19",
"estimatedDelayDays": 147,
"inspectDate": {
"$date": "2022-10-19T00:00:00.000Z"
},
"qualityConfirmationCode": "R",
"qualityConfirmationComment": "ABC CONFIRMATION ACTIVITY",
"qualityConfirmationDescription": "RELEASED",
"qualityConfirmationYear": 2022,
"repairDate": {
"$date": "2022-11-08T00:00:00.000Z"
},
"stopSaleNumber": "265"
}
}
}
}
]
I’ve used below schema and query for same.
"mappings": {
"dynamic": true,
"fields": {
"qualityConfirmations": {
"type": "document",
"dynamic": true,
"fields": {
"*": {
"dynamic": true,
"type": "document",
"fields": {
"qualityConfirmation": {
"type": "document",
"dynamic": false,
"fields": {
"qualityConfirmationComment": {
"type": "string",
"analyzer": "earmarkAnalyzer"
}
}
}
}
}
}
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "earmarkAnalyzer",
"tokenFilters": [],
"tokenizer": {
"type": "keyword"
}
}
]
}
**QUERY:**
[
{
$search: {
index: "default",
compound: {
must: [
{
phrase: {
path: {
wildcard:
"qualityConfirmations.*.qualityConfirmation.qualityConfirmationComment"
},
query: ["ABC CONFIRMATION"],
}
},
],
mustNot: [],
should: [],
minimumShouldMatch: 0,
},
},
},
]
But the result is not coming as expected. For example, If I want to use exact match , it still brings up all the results matching input, I’ve also used KEYWORD analyzer to create single token but it is not working. I want to search for both string and date Types.
Please find below the atlas playground link for same .
https://search-playground.mongodb.com/tools/code-sandbox/snapshots/676030e03206573cca5920b8