cari
Rumahpangkalan dataMongoDBMari bercakap dengan anda tentang jenis indeks kaya dalam MongoDB

Artikel ini akan membawa anda memahami MongoDB dan memperkenalkan jenis indeks yang kaya dalam MongoDB. Saya harap ia dapat membantu semua orang.

Mari bercakap dengan anda tentang jenis indeks kaya dalam MongoDB

MongoDB indeks dan MySql pada dasarnya mempunyai fungsi dan prinsip yang serupa untuk diikuti untuk pengoptimuman MySql jenis indeks pada asasnya boleh dibezakan sebagai:

  • Indeks kunci tunggal - Indeks kesatuan
  • Indeks kunci utama (indeks berkelompok) - Indeks kunci bukan utama (indeks bukan berkelompok)

Kecuali dalam MongoDB Selain klasifikasi asas ini, terdapat juga beberapa jenis indeks khas, seperti: indeks tatasusunan |. indeks geospatial |. untuk memasukkan data berikut

for(var i = 0;i < 100000;i++){
    db.users.insertOne({
        username: "user"+i,
        age: Math.random() * 100,
        sex: i % 2,
        phone: 18468150001+i
    });
}
Indeks kunci tunggal

Indeks kunci tunggal bermakna terdapat hanya satu medan diindeks, iaitu kaedah pengindeksan yang paling asas.

Gunakan dalam medan koleksi

, buat indeks kunci tunggal,

akan secara automatik menamakan indeks ini usernameMongoDBusername_1

Selepas mencipta indeks, semak pelan pertanyaan menggunakan medan
db.users.createIndex({username:1})
&#39;username_1&#39;
,

ialah username mewakili penggunaan imbasan indeks stageIXSCAN

Antara prinsip pengoptimuman indeks, prinsip yang sangat penting ialah indeks harus dibina di atas medan dengan kardinaliti yang tinggi. Apa yang dipanggil kardinaliti bermaksud tiada pengulangan dalam sesuatu medan, iaitu apabila kita mencipta koleksi
db.users.find({username:"user40001"}).explain()
{ 
   queryPlanner: 
   { 
     winningPlan: 
     { 
        ......
        stage: &#39;FETCH&#39;,
        inputStage: 
        { 
           stage: &#39;IXSCAN&#39;,
           keyPattern: { username: 1 },
           indexName: &#39;username_1&#39;,
           ......
        } 
     }
     rejectedPlans: [] ,
   },
   ......
   ok: 1 
}
, nilai umur ialah

, kemudian users. medan akan mempunyai 100 nilai unik, iaitu asas medan 0-99 ialah 100 dan ageMedan ini hanya akan mempunyai dua nilai age, iaitu asas medan sex ialah 2, yang merupakan asas yang agak rendah Dalam kes ini, kecekapan pengindeksan tidak tinggi dan akan menyebabkan kegagalan indeks .0 | 1sexBerikut ialah indeks medan

akan mendapati bahawa pertanyaan menggunakan imbasan jadual penuh dan bukannya indeks yang berkaitan.

sex

db.users.createIndex({sex:1})
&#39;sex_1&#39;

db.users.find({sex:1}).explain()
{ 
  queryPlanner: 
  { 
     ......
     winningPlan: 
     { 
        stage: &#39;COLLSCAN&#39;,
        filter: { sex: { &#39;$eq&#39;: 1 } },
        direction: &#39;forward&#39; 
     },
     rejectedPlans: [] 
  },
  ......
  ok: 1 
}
Indeks bersama

Indeks bersama bermakna akan terdapat berbilang medan pada indeks. Mari gunakan dua medan

dan

untuk mencipta indeks agesex

dan kemudian kami Gunakan dua medan ini untuk menjalankan pertanyaan, semak pelan pelaksanaan dan berjaya melalui indeks ini
db.users.createIndex({age:1,sex:1})
&#39;age_1_sex_1&#39;

db.users.find({age:23,sex:1}).explain()
{ 
  queryPlanner: 
  { 
     ......
     winningPlan: 
     { 
        stage: &#39;FETCH&#39;,
        inputStage: 
        { 
           stage: &#39;IXSCAN&#39;,
           keyPattern: { age: 1, sex: 1 },
           indexName: &#39;age_1_sex_1&#39;,
           .......
           indexBounds: { age: [ &#39;[23, 23]&#39; ], sex: [ &#39;[1, 1]&#39; ] } 
        } 
     },
     rejectedPlans: [], 
  },
  ......
  ok: 1 
 }
Indeks tatasusunan

Indeks tatasusunan ialah untuk mencipta indeks medan tatasusunan, juga dipanggil indeks berbilang nilai, untuk ujian, tambahkan beberapa medan tatasusunan pada data dalam

koleksi.

users

Buat indeks tatasusunan dan lihat rancangan pelaksanaannya. Ambil perhatian bahawa
db.users.updateOne({username:"user1"},{$set:{hobby:["唱歌","篮球","rap"]}})
......
menunjukkan indeks yang digunakan ialah indeks berbilang nilai Berbanding dengan indeks lain, entri indeks dan volum indeks tatasusunan mesti meningkat secara eksponen Contohnya, purata

tatasusunan isMultiKey: true setiap dokumen ialah 10, Kemudian bilangan entri dalam indeks tatasusunan

koleksi ini. akan menjadi 10 kali ganda daripada indeks biasa
db.users.createIndex({hobby:1})
&#39;hobby_1&#39;

db.users.find({hobby:{$elemMatch:{$eq:"钓鱼"}}}).explain()
{ 
   queryPlanner: 
   { 
     ......
     winningPlan: 
     { 
        stage: &#39;FETCH&#39;,
        filter: { hobby: { &#39;$elemMatch&#39;: { &#39;$eq&#39;: &#39;钓鱼&#39; } } },
        inputStage: 
        { 
           stage: &#39;IXSCAN&#39;,
           keyPattern: { hobby: 1 },
           indexName: &#39;hobby_1&#39;,
           isMultiKey: true,
           multiKeyPaths: { hobby: [ &#39;hobby&#39; ] },
           ......
           indexBounds: { hobby: [ &#39;["钓鱼", "钓鱼"]&#39; ] } } 
         },
     rejectedPlans: [] 
  },
  ......
  ok: 1 
}

hobby Indeks tatasusunan kesatuan sizehobby

Indeks tatasusunan kesatuan ialah kesatuan yang mengandungi medan tatasusunan Indeks, indeks jenis ini tidak menyokong berbilang. medan tatasusunan dalam indeks, iaitu, boleh ada paling banyak satu medan tatasusunan dalam indeks Ini adalah untuk mengelakkan pertumbuhan entri indeks yang meletup Katakan terdapat dua medan tatasusunan dalam indeks, maka indeks ini Jumlah entri menjadi n*m ​​kali ganda daripada indeks biasa

Indeks spatial geografi

Tambahkan beberapa maklumat geografi pada koleksi

asal

Cipta indeks spatial dua dimensi

users

for(var i = 0;i < 100000;i++){
    db.users.updateOne(
    {username:"user"+i},
    {
        $set:{
            location:{
                type: "Point",
                coordinates: [100+Math.random() * 4,40+Math.random() * 3]
            }
        }
    });
}
indeks geospatial mempunyai banyak elemen termasuk

|

dsb.
db.users.createIndex({location:"2dsphere"})
&#39;location_2dsphere&#39;

//查询500米内的人
db.users.find({
  location:{
    $near:{
      $geometry:{type:"Point",coordinates:[102,41.5]},
      $maxDistance:500
    }
  }
})

typeIndeks TTLPonit(点)LineString(线)Polygon(多边形) Ejaan penuh TTL ialah

, yang digunakan terutamanya untuk memadam data tamat tempoh secara automatik Untuk menggunakan indeks ini, anda perlu mengisytiharkan medan jenis masa dalam dokumen , dan kemudian buat pengindeksan Apabila TTL, anda juga perlu menetapkan

unit masa tamat dalam beberapa saat Selepas penciptaan selesai, akan menyemak data dalam koleksi dengan kerap. Apabila: muncul
Masa semasaTT LMasa medan indeks>expireAfterSrconds Masa semasa - masa medan indeks TTL> luputSelepasSrconds

MongoDB将会自动将这些文档删除,这种索引还有以下这些要求:

  • TTL索引只能有一个字段,没有联合TTL索引
  • TTL不能用于固定集合
  • TTL索引是逐个遍历后,发现满足删除条件会使用delete函数删除,效率并不高

首先在我们文档上增减一个时间字段

for(var i = 90000;i < 100000;i++){
    db.users.updateOne(
    {username:"user"+i},
    {
        $set:{
            createdDate:new Date()
        }
    });
}

创建一个TTL索引并且设定过期时间为60s,待过60s后查询,会发现这些数据已经不存在

db.users.createIndex({createdDate:1},{expireAfterSeconds:60})
&#39;createdDate_1&#39;

另外还可以用CollMod命令更改TTL索引的过期时间

db.runCommand({
  collMod:"users",
  index:{
    keyPattern:{createdDate:1},
    expireAfterSeconds:120
  }
})

{ expireAfterSeconds_old: 60, expireAfterSeconds_new: 120, ok: 1 }

条件索引

条件索引也叫部分索引(partial),只对满足条件的数据进行建立索引.

只对50岁以上的user进行建立username_1索引,查看执行计划会发现isPartial这个字段会变成true

db.users.createIndex({username:1},{partialFilterExpression:{
    age:{$gt:50}
  }})
&#39;username_1&#39;

db.users.find({$and:[{username:"user4"},{age:60}]}).explain()
{ 
  queryPlanner: 
  { 
     ......
     winningPlan: 
     { 
        stage: &#39;FETCH&#39;,
        filter: { age: { &#39;$eq&#39;: 60 } },
        inputStage: 
        { 
           stage: &#39;IXSCAN&#39;,
           keyPattern: { username: 1 },
           indexName: &#39;username_1&#39;,
           ......
           isPartial: true,
           ......
         } 
     },
     rejectedPlans: [] 
  },
  ......
  ok: 1 
}

稀疏索引

        一般的索引会根据某个字段为整个集合创建一个索引,即使某个文档不存这个字段,那么这个索引会把这个文档的这个字段当作null建立在索引当中.

稀疏索引不会对文档中不存在的字段建立索引,如果这个字段存在但是为null时,则会创建索引.

下面给users集合中的部分数据创建稀疏索引

for(var i = 5000;i < 10000;i++){
  if(i < 9000){
    db.users.updateOne(
      {username:"user"+i},
      { $set:{email:(120000000+i)+"@qq.email"}}
    )
  }else{
    db.users.updateOne(
      {username:"user"+i},
      { $set:{email:null}}
    )
  }
}

当不建立索引使用{email:null}条件进行查询时,我们会发现查出来的文档包含没有email字段的文档

db.users.find({email:null})
{ 
  _id: ObjectId("61bdc01ba59136670f6536fd"),
  username: &#39;user0&#39;,
  age: 64.41483801726282,
  sex: 0,
  phone: 18468150001,
  location: 
  { 
    type: &#39;Point&#39;,
    coordinates: [ 101.42490900320335, 42.2576650823515 ] 
  } 
}
......

        然后对email这个字段创建一个稀疏索引使用{email:null}条件进行查询,则发现查询来的文档全部是email字段存在且为null的文档.

db.users.createIndex({email:1},{sparse:true});
&#39;email_1&#39;

db.users.find({email:null}).hint({email:1})
{ 
  _id: ObjectId("61bdc12ca59136670f655a25"),
  username: &#39;user9000&#39;,
  age: 94.18397576757012,
  sex: 0,
  phone: 18468159001,
  hobby: [ &#39;钓鱼&#39;, &#39;乒乓球&#39; ],
  location: 
  { 
    type: &#39;Point&#39;,
    coordinates: [ 101.25903151863596, 41.38450145025062 ] 
  },
  email: null 
}
......

文本索引

文本索引将建立索引的文档字段先进行分词再进行检索,但是目前还不支持中文分词.

下面增加两个文本字段,创建一个联合文本索引

db.blog.insertMany([
  {title:"hello world",content:"mongodb is the best database"},
  {title:"index",content:"efficient data structure"}
])

//创建索引
db.blog.createIndex({title:"text",content:"text"})
&#39;title_text_content_text&#39;
//使用文本索引查询
db.blog.find({$text:{$search:"hello data"}})
{ 
  _id: ObjectId("61c092268c4037d17827d977"),
  title: &#39;index&#39;,
  content: &#39;efficient data structure&#39; 
},
{ 
  _id: ObjectId("61c092268c4037d17827d976"),
  title: &#39;hello world&#39;,
  content: &#39;mongodb is the best database&#39; 
}

唯一索引

        唯一索引就是在建立索引地字段上不能出现重复元素,除了单字段唯一索引还有联合唯一索引以及数组唯一索引(即数组之间不能有元素交集 )

//对title字段创建唯一索引
db.blog.createIndex({title:1},{unique:true})
&#39;title_1&#39;
//插入一个已经存在的title值
db.blog.insertOne({title:"hello world",content:"mongodb is the best database"})
MongoServerError: E11000 duplicate key error collection: mock.blog index: title_1 dup key: { : "hello world" }
//查看一下执行计划,isUnique为true
db.blog.find({"title":"index"}).explain()
{ 
  queryPlanner: 
  { 
     ......
     winningPlan: 
     { 
        stage: &#39;FETCH&#39;,
        inputStage: 
        { 
           stage: &#39;IXSCAN&#39;,
           keyPattern: { title: 1 },
           indexName: &#39;title_1&#39;,
           isMultiKey: false,
           multiKeyPaths: { title: [] },
           isUnique: true,
           ......
         } 
     },
     rejectedPlans: [] 
  },
  .......
  ok: 1 
}

相关视频教程推荐:《MongoDB教程

Atas ialah kandungan terperinci Mari bercakap dengan anda tentang jenis indeks kaya dalam MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:掘金社区. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Cara Menghapus MongoDB dalam KumpulanCara Menghapus MongoDB dalam KumpulanApr 12, 2025 am 09:27 AM

Anda boleh menggunakan kaedah berikut untuk memadam dokumen di MongoDB: 1. 2. Ekspresi biasa sepadan dengan dokumen yang memenuhi kriteria; 3. $ Ada pengendali memadam dokumen dengan medan yang ditentukan; 4. Kaedah mencari () dan keluarkan () terlebih dahulu dapatkan dan kemudian padamkan dokumen. Sila ambil perhatian bahawa operasi ini tidak boleh menggunakan transaksi dan boleh memadam semua dokumen yang sepadan, jadi berhati -hati apabila menggunakannya.

Cara menetapkan arahan MongoDBCara menetapkan arahan MongoDBApr 12, 2025 am 09:24 AM

Untuk menubuhkan pangkalan data MongoDB, anda boleh menggunakan baris perintah (penggunaan dan db.createCollection ()) atau shell mongo (mongo, penggunaan dan db.createCollection ()). Pilihan tetapan lain termasuk melihat pangkalan data (tunjukkan DBS), koleksi tontonan (tunjukkan koleksi), memadam pangkalan data (db.dropdatabase ()), memadam koleksi (db. & Amp; lt; collection_name & amp; gt;

Cara Menggunakan Kluster MongoDBCara Menggunakan Kluster MongoDBApr 12, 2025 am 09:21 AM

Menggunakan kluster MongoDB dibahagikan kepada lima langkah: menggunakan nod utama, menggunakan nod sekunder, sambil menambah nod sekunder, mengkonfigurasi replikasi, dan mengesahkan kluster. Termasuk memasang perisian MongoDB, membuat direktori data, memulakan contoh MongoDB, memulakan set replikasi, menambah nod sekunder, membolehkan ciri -ciri set replika, mengkonfigurasi hak mengundi, dan mengesahkan status kluster dan replikasi data.

Cara Menggunakan Senario Aplikasi MongoDBCara Menggunakan Senario Aplikasi MongoDBApr 12, 2025 am 09:18 AM

MongoDB digunakan secara meluas dalam senario berikut: Penyimpanan Dokumen: Menguruskan data berstruktur dan tidak berstruktur seperti maklumat pengguna, kandungan, katalog produk, dan lain-lain. Analisis masa nyata: Permintaan cepat dan menganalisis data masa nyata seperti log, memantau pemutihan papan pemantauan, dan lain-lain. Internet Perkara: Proses data siri masa besar seperti pemantauan peranti, pengumpulan data dan pengurusan jauh. Aplikasi Mudah Alih: Sebagai pangkalan data backend, menyegerakkan data peranti mudah alih, menyediakan storan luar talian, dan lain-lain. Bidang lain: Senario pelbagai seperti e-dagang, penjagaan kesihatan, perkhidmatan kewangan dan pembangunan permainan.

Cara Melihat Versi MongoDBCara Melihat Versi MongoDBApr 12, 2025 am 09:15 AM

Cara Melihat Versi MongoDB: Baris Perintah: Gunakan perintah db.version (). Pemacu Bahasa Pemrograman: python: cetak (client.server_info () ["versi"]) node.js: db.command ({versi: 1}, (err, result) = & gt; {console.log (result.version);});

Cara menyusun mongodbCara menyusun mongodbApr 12, 2025 am 09:12 AM

MongoDB menyediakan mekanisme penyortiran untuk menyusun koleksi dengan medan tertentu, menggunakan sintaks db.collection.find (). Sort ({field: order}) urutan menaik/menurun, menyokong penyortiran kompaun oleh pelbagai bidang, dan mengesyorkan mewujudkan indeks untuk meningkatkan prestasi menyusun.

Cara menyambung ke mongodbCara menyambung ke mongodbApr 12, 2025 am 09:09 AM

Untuk menyambung ke MongoDB dengan Navicat: Pasang Navicat dan buat sambungan MongoDB; Masukkan alamat pelayan di hos, masukkan nombor port di port, dan masukkan maklumat pengesahan MongoDB dalam nama pengguna dan kata laluan; menguji sambungan dan simpan; Navicat akan menyambung ke pelayan MongoDB.

Cara Menghapus Dokumen di MongodbCara Menghapus Dokumen di MongodbApr 12, 2025 am 09:06 AM

MongoDB menyediakan pelbagai kaedah penghapusan dokumen: Padam satu dokumen: Gunakan kaedah DeleteOne () untuk menentukan objek pertanyaan. Padam pelbagai dokumen: Gunakan kaedah DeleteMany () untuk menentukan objek pertanyaan. Padam keseluruhan koleksi: Gunakan kaedah drop (). Padam Dokumen Menggunakan Indeks: Gunakan kaedah FindOneandDelete () untuk menentukan objek pertanyaan dan mengembalikan dokumen yang dipadam. Padam Dokumen Terbenam: Gunakan Operator Kemas Kini $ Unset untuk menetapkan medan dokumen tertanam ke NULL.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini