sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo-indexering på objektmatriser kontra objekt

Frågan kommer säkert att bli mycket lättare i det andra fallet, där "grupper" är en uppsättning underdokument, var och en med ett "id" och ett "namn".

Mongo stöder inte "jokertecken"-frågor, så om dina dokument var strukturerade på det första sättet och du ville hitta ett underdokument med värdet "hej", men inte visste att nyckeln var 152, skulle du inte kunna gör det. Med den andra dokumentstrukturen kan du enkelt fråga efter {"groups.name":"hej"}.

För mer information om att söka efter inbäddade objekt, se dokumentationen med titeln "Dot Notation (Reaching into Objects)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 Avsnitten "Värde i en array" och "Värde i ett inbäddat objekt" i dokumentationen "Advanced Queries" är också användbara:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

För ett index på {'groups.id':1} kommer en indexpost att skapas för varje "id"-nyckel i varje "groups"-array i varje dokument. Med ett index på "grupper" kommer endast en indexpost att skapas per dokument.

Om du har dokument av den andra typen och ett index på grupper måste dina frågor matcha hela underdokument för att kunna använda indexet. Till exempel med tanke på dokumentet:

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

Frågan

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

kommer att använda indexet, men frågorna

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

eller

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

ska inte.

Indexet/indexen som du skapar bör bero på vilka frågor du oftast kommer att utföra.

Du kan experimentera med vilka (om några) index som dina frågor använder med kommandot .explain(). http://www.mongodb.org/display/DOCS/Explain Den första raden, "markören" kommer att berätta vilket index som används. "cursor" :"BasicCursor" indikerar att en fullständig samlingsskanning utförs.

Det finns mer information om indexering i dokumentationen:http://www.mongodb.org/display /DOCS/Index

Avsnittet "Indexing Array Elements" i ovanstående länkar till dokumentet med titeln "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Förhoppningsvis kommer detta att förbättra din förståelse för hur man frågar på inbäddade dokument och hur index används. Meddela oss om du har några följdfrågor!




  1. MonogoDB Replica Set Status ändras inte från start till sekundär

  2. Hur man konfigurerar SELinux för MongoDB Replica Sets

  3. MongoClient fungerar inte med php

  4. Undvik sammanlagd 16MB-gräns