MongoDB
index
Sök…
Syntax
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
Anmärkningar
Effektpåverkan : Observera att index förbättrar läsprestanda, men kan ha dålig inverkan på skrivprestanda, eftersom att infoga ett dokument kräver uppdatering av alla index.
Enstaka fält
db.people.createIndex({name: 1})
Detta skapar en stigande enda fält index på fältnamnet.
I denna typ av index är sorteringsordningen inte relevant, eftersom mongo kan korsa indexet i båda riktningarna.
Förening
db.people.createIndex({name: 1, age: -1})
Detta skapar ett index på flera områden, i detta fall på name
och age
fält. Det kommer att vara stigande i name
och fallande i age
.
I denna typ av index är sorteringsordningen relevant, eftersom den kommer att avgöra om indexet kan stödja en sorteringsoperation eller inte. Omvänd sortering stöds på valfri prefix för ett sammansatt index, så länge sorteringen är i omvänd sorteringsriktning för alla tangenter i sorteringen. Annars måste sortering för sammansatta index matcha ordningens index.
Fältordning är också viktigt i detta fall index sorteras först efter name
, och inom varje namn värde, sorterade efter värdena för age
Detta gör det index som ska användas av förfrågningar på name
fältet eller på name
och age
, men inte på age
ensam.
Radera
För att släppa ett index kan du använda indexnamnet
db.people.dropIndex("nameIndex")
Eller indexspecifikationsdokumentet
db.people.dropIndex({name: 1})
Lista
db.people.getIndexes()
Detta kommer att returnera en rad dokument vardera beskriver ett index på människor insamling
Grunderna för skapande av index
Se transaktionssamlingen nedan.
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
-funktioner visar alla tillgängliga index för en samling.
db.transactions.getIndexes();
Låt oss se utgången från ovanstående uttalande.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Det finns redan ett index för transaktionssamling. Detta beror på att MongoDB skapar ett unikt index på _id
fältet under skapandet av en samling. _id
indexet hindrar klienter från att infoga två dokument med samma värde för _id
fältet. Du kan inte släppa detta index i fältet _id
.
Låt oss nu lägga till ett index för cr_dr-fältet;
db.transactions.createIndex({ cr_dr : 1 });
Resultatet av indexutförandet är som följer.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Den skapade samlingen anger automatiskt om operationen skapade en samling. Om en samling inte finns skapar MongoDB samlingen som en del av indexeringsoperationen.
Låt köra db.transactions.getIndexes();
igen.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
Nu ser du att transaktionssamlingen har två index. Standard _id
index och cr_dr_1
som vi skapade. Namnet tilldelas av MongoDB. Du kan ställa in ditt eget namn som nedan.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
Nu db.transactions.getIndexes();
ger dig tre index.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
När du skapar index { cr_dr : -1 }
1 betyder att index kommer att vara i ascending
ordning och -1 för descending
ordning.
Hashade index
Index kan också definieras som hashed . Detta är mer framträdande när det gäller jämställdhetsfrågor , men är inte effektiv för intervallfrågor ; du kan dock definiera både hashade och stigande / fallande index i samma fält.
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
Släppa / ta bort ett index
Om indexnamnet är känt,
db.collection.dropIndex('name_of_index');
Om indexnamnet inte är känt,
db.collection.dropIndex( { 'name_of_field' : -1 } );
Få index för en samling
db.collection.getIndexes();
Produktion
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Unikt index
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
verkställa unikhet på det definierade indexet (antingen enstaka eller sammansatt). Att bygga indexet misslyckas om samlingen redan innehåller duplicerade värden; indexeringen misslyckas också med flera poster som saknar fältet (eftersom de alla kommer att indexeras med värdet null
) såvida inte sparse: true
anges.
Sparsamma index och Partiella index
Sparsamma index:
Dessa kan vara särskilt användbara för fält som är valfria men som också bör vara unika.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
Eftersom två poster har inget "smeknamn" och indexering kommer att behandla ospecificerade fält som null, skulle index skapandet misslyckas med två dokument som har 'null', så:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
låter dig fortfarande ha "null" smeknamn.
Sparsamma index är mer kompakta eftersom de hoppar över / ignorerar dokument som inte anger det fältet. Så om du har en samling där endast mindre än 10% av dokumenten anger detta fält kan du skapa mycket mindre index - bättre utnyttja det begränsade minnet om du vill göra frågor som:
db.scores.find({'nickname': 'Johnnie'})
Partiella index:
Partiella index representerar ett superset av funktionaliteten som erbjuds av glesa index och bör föredras framför glesa index. ( Ny i version 3.2 )
Partiella index bestämmer indexposterna baserat på det angivna filtret.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Om rating
är högre än 5 indexeras cuisine
. Ja, vi kan ange en egenskap som ska indexeras baserat på värdet på andra egenskaper också.
Skillnaden mellan Sparse och Partial index:
Sparsamma index väljer dokument som ska indexeras enbart baserat på förekomsten av det indexerade fältet, eller för sammansatta index, förekomsten av de indexerade fälten.
Partiella index bestämmer indexposterna baserat på det angivna filtret. Filtret kan innehålla andra fält än indextangenterna och kan ange andra förhållanden än bara en existenskontroll.
Fortfarande kan ett partiellt index implementera samma beteende som ett glest index
T.ex:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
Obs: Både alternativet partiellfilteruttryck och sparsamt alternativ kan inte anges samtidigt.