sql >> Databasteknik >  >> NoSQL >> MongoDB

Sortering på Flera fält mongo DB

MongoDB-frågeoptimeraren fungerar genom att prova olika planer för att avgöra vilket tillvägagångssätt som fungerar bäst för en given fråga. Den vinnande planen för det frågemönstret cachelagras sedan för nästa ~1 000 frågor eller tills du gör en explain() .

För att förstå vilka frågeplaner som övervägdes bör du använda explain(1) , t.ex.:

db.col.find({category:'A'}).sort({updated: -1}).explain(1)

allPlans detalj kommer att visa alla planer som jämfördes.

Om du kör en fråga som inte är särskilt selektiv (till exempel om många poster matchar dina kriterier för {category: { $ne:'A'}} ), kan det vara snabbare för MongoDB att hitta resultat med en BasicCursor (tabellskanning) snarare än att matcha mot ett index.

Ordningen på fälten i frågan gör i allmänhet ingen skillnad för indexvalet (det finns några få undantag med intervallfrågor). Ordningen på fält i en sortering påverkar indexvalet. Om din sort() kriterierna inte matchar indexordningen, resultatdata måste sorteras om efter att indexet har använts (du bör se scanAndOrder:true i förklara-utgången om detta händer).

Det är också värt att notera att MongoDB endast kommer att använda ett index per fråga (med undantag för $or s).

Så om du försöker optimera frågan:

db.col.find({category:'A'}).sort({updated: -1, rating: -1})

Du vill inkludera alla tre fälten i indexet:

db.col.ensureIndex({category: 1, updated: -1, rating: -1})

FYI, om du vill tvinga en viss fråga att använda ett index (vanligtvis inte behövs eller rekommenderas), det finns en hint() alternativ du kan prova.



  1. Hur man formaterar datumet i MongoDB

  2. Spring Data Redis Expire Key

  3. Mongo C# JSON-läsaren förväntade sig ett värde men hittade 'replSetGetStatus'

  4. Hur kontrollerar man om ett arrayfält är en del av en annan array i MongoDB?