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_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.

2,4

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow