Forespørgselsbetingelser med .distinct()
gælder for "dokumentvalg" og ikke de array-indgange, der er indeholdt "i" dokumentet. Hvis du har brug for at "filtrere" matrixindhold, skal du anvende .aggregate()
i stedet, samt lidt efterbehandling for kun at få "værdierne" i array-svaret.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
De vigtigste dele der er $unwind
pipeline-stadiet, som du primært gør, fordi du ønsker, at værdierne fra arrayet senere skal bruges som nøglen til $group
på. Dette producerer i det væsentlige et nyt dokument for hvert array-medlem, men hvert dokument indeholder kun det array-medlem. Det "denormaliserer" for MongoDB-strukturer, der indeholder arrays.
Den næste ting er følgende $match
pipeline, der fungerer som enhver forespørgsel og kun vælger dokumenter, der matcher betingelserne. Da alle array-medlemmer nu er "dokumenter", bliver ikke-matchende poster (som dokumenter) ekskluderet. Du kan alternativt bruge $filter
at udtrække, mens det stadig er et array, men da vi har brug for $unwind
til næste trin kan vi lige så godt bare $match
.
På dette tidspunkt er du kun tilbage med de array-indgange, der matcher betingelserne. $group
er at opnå "særlige" værdier, så typisk ville du gøre dette over et bredere udvalg end blot et enkelt dokument eller noget, hvor værdierne her ikke allerede er adskilte. Så dette er egentlig bare at bevare den samme adfærd som .distinct()
intakt.
Endelig, siden outputtet af .aggregate()
adskiller sig fra designet af .distinct()
i og med at det returnerer "dokumenter" i resultater, bruger vi blot