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

Mongo-indeksering på objektarrays vs. objekter

Forespørgsel vil helt sikkert være meget lettere i det andet tilfælde, hvor 'grupper' er en række underdokumenter, hver med et 'id' og et 'navn'.

Mongo understøtter ikke "wildcard"-forespørgsler, så hvis dine dokumenter var struktureret på den første måde, og du ville finde et underdokument med værdien "hej", men ikke vidste, at nøglen var 152, ville du ikke være i stand til at gør det. Med den anden dokumentstruktur kan du nemt forespørge efter {"groups.name":"hej"}.

For mere information om forespørgsler om indlejrede objekter, se venligst dokumentationen med titlen "Dot Notation (Reaching into Objects)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 Sektionerne "Værdi i et array" og "Værdi i et indlejret objekt" i dokumentationen "Avancerede forespørgsler" er også nyttige:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

For et indeks på {'groups.id':1} vil der blive oprettet en indeksindgang for hver "id"-nøgle i hvert "groups"-array i hvert dokument. Med et indeks på "grupper" vil der kun blive oprettet én indekspost pr. dokument.

Hvis du har dokumenter af den anden type og et indeks på grupper, skal dine forespørgsler matche hele underdokumenter for at kunne bruge indekset. For eksempel givet dokumentet:

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }

Forespørgslen

db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 

vil gøre brug af indekset, men forespørgslerne

db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})

eller

db.<collectionName>.find({"groups.name":"hi"})

vil ikke.

Indekset/indekserne, du opretter, bør afhænge af, hvilke forespørgsler du oftest vil udføre.

Du kan eksperimentere med hvilke (hvis nogen) indekser dine forespørgsler bruger med kommandoen .explain(). http://www.mongodb.org/display/DOCS/Explain Den første linje, "cursor" vil fortælle dig, hvilket indeks der bruges. "cursor" :"BasicCursor" angiver, at en fuld indsamlingsscanning udføres.

Der er flere oplysninger om indeksering i dokumentationen:http://www.mongodb.org/display /DOCS/Indekser

Sektionen "Indexing Array Elements" i ovenstående linker til dokumentet med titlen "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Forhåbentlig vil dette forbedre din forståelse af, hvordan du forespørger på indlejrede dokumenter, og hvordan indekser bruges. Fortæl os venligst, hvis du har opfølgende spørgsmål!




  1. Brug af Redis SCAN i NODE

  2. Node.js genbrug MongoDB-reference

  3. Mest populære NoSQL-databaser understøttet af ClusterControl

  4. Hvordan opdaterer man indlejret dokument i mongoose?