sql >> Databasteknik >  >> NoSQL >> MongoDB

Aggregationspipeline och index

I allmänhet är det bara pipeline-operatörer som kan platta till en normal fråga ($match , $limit , $sort och $skip ) kommer att kunna använda indexen på en samling. Detta är en av anledningarna till att $geoNear operatör som lagts till i 2.4 måste vara i början av pipelinen.

När du har muterat dokumenten med $project , $group , eller $unwind indexet är inte längre giltigt/användbart.

Om du har ett index på ett matrisfält kan du fortfarande använda det före $unwind för att påskynda valet av dokument som ska pipeline och sedan ytterligare förfina de valda dokumenten med en andra $match .

Tänk på dokument som:

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

Med ett index på tags .

Om du bara ville gruppera taggarna som börjar med b då kan du utföra en aggregering som:

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

Den första $match stämmer grovkornen med indexet på tags .

Den andra matchningen efter $unwind kommer inte att kunna använda indexet (dokumentet ovan är nu 3 dokument) men kan utvärdera vart och ett av dessa dokument för att filtrera bort de extra dokument som skapas (för att ta bort { taggar :'katt' } från exemplet).

HTH - Rob.



  1. Hur inaktiverar man loggning av mongoDB java-drivrutiner?

  2. MongoDB uppdaterar alla fält med arrayfel

  3. Mongo db - Fråga efter kapslad array och objekt

  4. Node.js visar bilder från Mongo's GridFS