sql >> Databasteknik >  >> NoSQL >> MongoDB

Underdokument index i mongo

Du kan göra antingen :

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

Detta diskuteras i dokumentationen under index-på-inbäddade-fält och index på underdokument

Det viktiga avsnittet i underdokumentsektionen är 'När man utför jämställdhetsmatchningar på underdokument, måste fältordningsärenden och underdokumenten matcha exakt.'

Detta betyder att de två indexen är desamma för enkla frågor.

Men som exemplet med underdokument visar kan du få några intressanta resultat (som du kanske inte förväntar dig) om du bara indexerar hela underdokumentet i motsats till ett specifikt fält och sedan gör en jämförelseoperator (som $gte ) - om du indexerar ett specifikt underfält får du ett mindre flexibelt, men potentiellt mer användbart index.

Allt beror verkligen på ditt användningsfall.

Hur som helst, när du har skapat indexet kan du kontrollera vad som skapas med :

> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

Som du kan se från utdata skapade den en ny nyckel som heter data.name_1_data.age_1_data.job_1 (den _id_ index skapas alltid).

Om du vill testa ditt nya index kan du göra:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

Huvudsaken är att du kan se att ditt nya index användes (BtreeCursor data.name_1_data.age_1_data.job_1 i markörfältet är det som indikerar att så är fallet). Om du ser "cursor" : "BasicCursor" , då användes inte ditt index.

För mer detaljerad information se här.



  1. Mongoose skriver över dokumentet snarare än `$set`-fält

  2. finns det något sätt att få klientens IP i redis?

  3. Varför läggs ett _id med ObjectID till när man använder MongoDB:s $push för att lägga till nytt objekt i en array?

  4. Hur man använder mongoimport för att importera csv