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

MongoDB $indexOfArray

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 .


  1. returforespørgsel baseret på dato

  2. redis scanning returnerer tomme resultater, men ikke-nul markør

  3. Hvordan deaktiverer man mongoDB java-driverlogning?

  4. Mongos Installation/Opsætning i Elastic Beanstalk