I MongoDB er $indexOfArray
aggregeringspipeline-operatør søger i et array efter en forekomst af en specificeret værdi og returnerer arrayindekset for den første forekomst.
Syntaks
Syntaksen ser sådan ud:
{ $indexOfArray:[ , , , ] }
Hvor:
er det array, der skal søges i. er den værdi, du vil finde i arrayet.er et valgfrit argument, der angiver et udgangspunkt, som der skal søges efter i arrayet. Kan være et hvilket som helst gyldigt udtryk, der opløses til et ikke-negativt heltal. er et valgfrit argument, der angiver en afsluttende indeksposition for søgningen. Kan være et hvilket som helst gyldigt udtryk, der opløses til et ikke-negativt heltal.
I MongoDB er arrays nul-baserede, så indekstællingen starter ved nul (0
).
Hvis den angivne værdi ikke findes, $indexOfArray
returnerer -1
.
Hvis der er flere forekomster af den angivne værdi, returneres kun den første.
Eksempel
Antag, at vi har en samling kaldet produkter
med følgende dokumenter:
{ "_id" :1, "prod" :"Flagermus", "størrelser" :[ "XS", "M", "L" ] }{ "_id" :2, "prod" :"Hat" , "sizes" :[ "XS", "S", "L", "XL" ] }{ "_id" :3, "prod" :"Cap", "sizes" :[ "XXS", "XS" , "M", "XL" ] }{ "_id" :4, "prod" :"Zap", "størrelser" :[ 10, 12, 15 ] }{ "_id" :5, "prod" :"Tryk ", "størrelser" :[ 15, 16, 20 ] }
Her er et eksempel på anvendelse af $indexOfArray
til disse dokumenter:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3, 4, 5 ] } } }, { $project:{ _id:0, sizes:1, resultat:{ $indexOfArray:[ "$sizes", "XS" ] } } } ])
Resultat:
{ "sizes" :[ "XS", "M", "L" ], "result" :0 }{ "sizes" :[ "XS", "S", "L", "XL" ] , "result" :0 }{ "sizes" :[ "XXS", "XS", "M", "XL" ], "result" :1 }{ "sizes" :[ 10, 12, 15 ], " resultat" :-1 }{ "størrelser" :[ 15, 16, 20 ], "resultat" :-1 }
I de første to dokumenter blev søgeværdien fundet ved position 0
(arrays er nul-baserede).
I det tredje dokument blev det fundet på position 1
. Bemærk, at søgningen var efter et nøjagtigt match. Det returnerede ikke position 0
, selvom værdien ved position 0
indeholder søgeværdien (dvs. XXS
indeholder XS
).
Søgeværdien blev ikke fundet i de sidste to dokumenter, og derfor -1
blev returneret.
Her er et andet eksempel, bortset fra at denne gang søger vi efter en numerisk værdi:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3, 4, 5 ] } } }, { $project:{ _id:0, sizes:1, resultat:{ $indexOfArray:[ "$sizes", 15 ] } } } ])
Resultat:
{ "sizes" :[ "XS", "M", "L" ], "result" :-1 }{ "sizes" :[ "XS", "S", "L", "XL" ], "result" :-1 }{ "sizes" :[ "XXS", "XS", "M", "XL" ], "result" :-1 }{ "sizes" :[ 10, 12, 15 ], "result" :2 }{ "sizes" :[ 15, 16, 20 ], "result" :0 }
Angiv en startposition
Du kan angive et tredje argument for at angive en startindeksposition for søgningen.
Eksempel:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 4, 5 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $ indexOfArray:[ "$størrelser", 15, 1 ] } } } ])
Resultat:
{ "sizes" :[ 10, 12, 15 ], "result" :2 }{ "sizes" :[ 15, 16, 20 ], "result" :-1 }
I dette tilfælde blev søgeudtrykket ikke fundet i det andet dokument (dokument 5). Dette skyldes, at vi startede søgningen ved position 1
, og selvom det dokument indeholder søgeudtrykket, er det på position 0
(før startpositionen for søgningen).
Angiv en slutposition
Du kan også angive et fjerde argument for at angive den afsluttende indeksposition for søgningen.
Hvis du giver dette argument, skal du også angive en startposition. Hvis dette ikke gøres, vil dette argument blive fortolket som udgangspunktet.
Eksempel:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XS", 0, 1 ] } } } ])
Resultat:
{ "sizes" :[ "XS", "M", "L" ], "result" :0 }{ "sizes" :[ "XS", "S", "L", "XL" ] , "result" :0 }{ "sizes" :[ "XXS", "XS", "M", "XL" ], "result" :-1 }
Det tredje dokument returnerede -1
hvilket betyder, at søgeudtrykket ikke blev fundet.
Her er, hvad der sker, hvis vi øger slutindekspositionen med 1:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XS", 0, 2 ] } } } ])
Resultat:
{ "sizes" :[ "XS", "M", "L" ], "result" :0 }{ "sizes" :[ "XS", "S", "L", "XL" ] , "result" :0 }{ "sizes" :[ "XXS", "XS", "M", "XL" ], "result" :1 }
Denne gang blev værdien inkluderet, og dens indeksposition returneret.
Tomme arrays
Søgning i et tomt array returnerer -1
.
db.products.aggregate( [ { $match:{ _id:{ $in:[ 6 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XS" ] } } } ])
Resultat:
{ "sizes" :[ ], "result" :-1 }
Manglende felter
Hvis feltet ikke er i dokumentet, $indexOfArray
returnerer null
.
Antag, at vi har følgende dokument:
{ "_id" :8, "prod" :"Kort" }
Her er, hvad der sker, når vi anvender $indexOfArray
:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 8 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XS" ] } } } ])
Resultat:
{ "result" :null }
Nul-værdier
Hvis matrixudtrykket er null
(i stedet for et array), $indexOfArray
returnerer null
.
Antag, at vi har følgende dokument:
{ "_id" :7, "prod" :"Lap", "sizes" :null }
Her er, hvad der sker, når vi anvender $indexOfArray
:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 7 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XS" ] } } } ])
Resultat:
{ "sizes" :null, "result" :null }
Men når søgeudtrykket er null
, resultatet er -1
, medmindre matrixudtrykket også er null
eller dets felt mangler:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3, 4, 5, 6, 7, 8 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$sizes", null ] } } } ])
Resultat:
{ "sizes" :[ "XS", "M", "L" ], "result" :-1 }{ "sizes" :[ "XS", "S", "L", "XL" ], "result" :-1 }{ "sizes" :[ "XXS", "XS", "M", "XL" ], "result" :-1 }{ "sizes" :[ 10, 12, 15 ], "result" :-1 }{ "sizes" :[ 15, 16, 20 ], "result" :-1 }{ "sizes" :[ ], "result" :-1 }{ "sizes" :null , "result" :null }{ "result" :null }
Forkert datatype
Hvis matrixudtrykket er den forkerte datatype, $indexOfArray
returnerer en fejl.
Antag, at vi har følgende dokument:
{ "_id" :9, "prod" :"Boks", "størrelser" :"XXL" }
Her er, hvad der sker, når vi anvender $indexOfArray
til det dokument:
db.products.aggregate( [ { $match:{ _id:{ $in:[ 9 ] } } }, { $project:{ _id:0, størrelser:1, resultat:{ $indexOfArray:[ "$størrelser", "XXL" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$indexOfArray kræver et array som et første argument, fundet:streng", "code" :40090, "codeName" :"Location40090 "} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell):1:1
Som fejlmeddelelsen siger, kræver $indexOfArray et array som første argument
.