sql >> Database teknologi >  >> NoSQL >> MongoDB

Få forskellige værdier fra array baseret på forhold i arrayet

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 .map() metode til at behandle markørresultaterne og kun returnere "værdierne" fra den specifikke dokumentegenskab som en "array".



  1. Hvordan indstiller jeg serialiseringsindstillingerne for geo-værdierne ved hjælp af den officielle 10gen C#-driver?

  2. præstationsproblem på Spring Data Mongodb

  3. Er det muligt at omdøbe _id-feltet efter mongos gruppesammenlægning?

  4. Mongodb 2dsphere-indeks for indlejret array-felt