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

Aggregationspipeline og indekser

Generelt er det kun pipeline-operatorer, der kan udflades til en normal forespørgsel ($match , $limit , $sort , og $skip ) vil kunne bruge indekserne på en samling. Dette er en af ​​grundene til, at $geoNear operatør tilføjet i 2.4 skal være ved starten af ​​pipelinen.

Når du muterer dokumenterne med $project , $group , eller $unwind indekset er ikke længere gyldigt/brugbart.

Hvis du har et indeks på et matrixfelt, kan du stadig bruge det før $unwind for at fremskynde udvælgelsen af ​​dokumenter til pipeline og derefter forfine de valgte dokumenter yderligere med en anden $match .

Overvej dokumenter som:

{ tags: [ 'cat', 'bird', 'blue' ] }

Med et indeks på tags .

Hvis du kun ønskede at gruppere tags, der starter med b så kunne du udføre en sammenlægning som:

{ pipeline: [
      { $match : { tags : /^b/ } },
      { $unwind : '$tags' },
      { $match : { tags : /^b/ } },
      /* the rest */
  ] }

Den første $match matcher det grove korn ved hjælp af indekset på tags .

Den anden kamp efter $unwind vil ikke være i stand til at bruge indekset (dokumentet ovenfor er nu 3 dokumenter), men kan evaluere hvert af disse dokumenter for at bortfiltrere de ekstra dokumenter, der bliver oprettet (for at fjerne { tags :'cat' } fra eksemplet).

HTH - Rob.



  1. MongoDB opdaterer array-objekt i et array

  2. Sådan opretter du RedisCacheManager i spring-data 2.0.x

  3. Kan redis-nøglepladsmeddelelser skubbes til redis-strømmen i stedet for pub/underkanal

  4. Opdater flere dokumenter og returner alle opdaterede dokumenter