sql >> Database >  >> NoSQL >> MongoDB

Mongo-indexering op objectarrays versus objecten

Query's zullen zeker een stuk eenvoudiger zijn in het tweede geval, waar 'groups' een array van subdocumenten is, elk met een 'id' en een 'name'.

Mongo ondersteunt geen "wildcard"-query's, dus als uw documenten op de eerste manier zijn gestructureerd en u een subdocument met de waarde "hi" wilt vinden, maar niet wist dat de sleutel 152 was, zou u niet in staat zijn om doe het. Met de tweede documentstructuur kunt u eenvoudig zoeken naar {"groups.name":"hi"}.

Voor meer informatie over het opvragen van ingesloten objecten, zie de documentatie met de titel "Dot Notation (Reaching into Objects)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 De secties "Waarde in een array" en "Waarde in een ingesloten object" van de documentatie "Advanced Queries" zijn ook nuttig:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Voor een index op {'groups.id':1} wordt een indexitem gemaakt voor elke "id"-sleutel in elke "groups"-array in elk document. Bij een index op "groepen" wordt er slechts één indexitem per document aangemaakt.

Als u documenten van het tweede type heeft, en een index op groepen, zullen uw zoekopdrachten moeten overeenkomen met volledige subdocumenten om gebruik te kunnen maken van de index. Bijvoorbeeld, gegeven het document:

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

De vraag

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

zal gebruik maken van de index, maar de queries

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

of

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

zal niet.

De index(en) die u maakt, moeten afhangen van de zoekopdrachten die u het meest zult uitvoeren.

Met de opdracht .explain() kunt u experimenteren met welke (indien van toepassing) indexen uw zoekopdrachten gebruiken. http://www.mongodb.org/display/DOCS/Explain De eerste regel, "cursor" zal u vertellen welke index wordt gebruikt. "cursor" :"BasicCursor" geeft aan dat een volledige collectiescan wordt uitgevoerd.

Er is meer informatie over indexeren in de documentatie:http://www.mongodb.org/display /DOCS/Indexen

De sectie "Array-elementen indexeren" van de bovenstaande links naar het document met de titel "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Hopelijk verbetert dit uw begrip van hoe u op ingesloten documenten kunt zoeken en hoe indexen worden gebruikt. Laat het ons weten als je vervolgvragen hebt!




  1. Selecteer records die overeenkomen met de concat-waarde van twee velden in mongodb

  2. mongodump Mislukt:slechte optie:kan slechts één verzameling naar stdout dumpen

  3. Mongodb Aggregatierijen naar kolommen

  4. hoe Mongo-gegevens importeren naar de ingezette meteor-app?