MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Indeks Multikey MongoDB &Batas Persimpangan Indeks

MongoDB memiliki dukungan hebat untuk array dan memberikan banyak fleksibilitas dalam mode dokumen Anda. Misalnya, Anda dapat menyematkan array dalam dokumen dan juga menyematkan dokumen dalam array, dll. Namun, bekerja dengan array memiliki sejumlah gotcha di MongoDB. Dalam postingan ini, kita akan melihat beberapa masalah yang dimiliki MongoDB dengan indeks dan array.

Indeks Multikey

Di MongoDB, Anda dapat mengindeks kolom array untuk membuat entri indeks untuk setiap elemen dalam array. Indeks yang dihasilkan disebut indeks 'multikey'. Indeks multikey dapat dibuat melalui nilai skalar atau dokumen yang disematkan. Untuk informasi selengkapnya tentang indeks multikunci, lihat dokumentasi ini.

Indeks multikey, meskipun berguna, memiliki beberapa keterbatasan:

  • Jika Anda membuat indeks multikunci majemuk, maka Anda memiliki paling banyak satu bidang yang berupa array.
  • Indeks gabungan tidak boleh berupa kunci pecahan.
  • Indeks gabungan tidak boleh berupa indeks hash.
Batasan Indeks Multikey MongoDB - Apa yang harus diperhatikan dalam kueri AndaKlik Untuk Tweet

Salah satu aspek yang paling menarik dari indeks multikey adalah bagaimana batas persimpangan indeks dihitung.

Batas Perpotongan Indeks

Berikut adalah bagaimana dokumentasi MongoDB mendefinisikan batas berpotongan indeks:

“Batas pemindaian indeks menentukan bagian indeks yang akan dicari selama kueri. Saat ada beberapa predikat di atas indeks, MongoDB akan mencoba menggabungkan batas untuk predikat ini dengan persimpangan atau penggabungan untuk menghasilkan pemindaian dengan batas yang lebih kecil.”

Rentang Kueri pada Array

Mari kita mulai dengan contoh sederhana untuk melihat bagaimana MongoDB menghitung batas indeks untuk kueri pada array. Asumsikan kita memiliki tiga dokumen berikut dalam koleksi:

{x:65}{x:35}{x:[12,95]}

Kami mengeluarkan pertanyaan berikut:

db.coll.find({x :{ $gt :22, $lt:55})

Permintaannya cukup sederhana. Anda akan mengharapkan jawabannya menjadi {x:35} tetapi kueri kembali:

{x:35}{x:[25,95]}

Alasannya berasal dari bagaimana MongoDB menangani array. Elemen larik yang sama tidak harus cocok dengan kedua kondisi; selama ada satu elemen yang cocok dengan setiap kondisi, itu cocok. Jadi, dalam hal ini, batasnya adalah [22, Tak terhingga] dan [-Tak terhingga, 55]. Karena operator 'elemMatch' tidak digunakan, MongoDB tidak menggunakan persimpangan indeks. MongoDB tidak menentukan rentang mana [22, Infinity] atau [-Infinity, 55] yang akan digunakan untuk eksekusi kueri.

Jika kita ingin menggunakan perpotongan indeks, maka kita perlu menggunakan query berikut:

db.coll.find(x :{ $elemMatch:{$gt :22,$lt:55}})

Saat Anda menggunakan ini, MongoDB memotong batas indeks dan menggunakan [22, 55] sebagai batas. Seperti yang diharapkan, kueri ini tidak mengembalikan hasil apa pun (elemMatch tidak cocok dengan non-array). Jadi, pada dasarnya, kueri rentang pada array cukup tidak berguna tanpa operator $elemMatch.

Indeks Multikey Gabungan – Mencampur Bidang Array dan Non-Array

Pertimbangkan koleksi dengan dokumen berikut:

{item:35, harga:[250,35]}......{item:106, harga:[1500,65]}

Kami akan menambahkan indeks gabungan pada koleksi ini:

db.ensureIndex({item:1, prices:1});

Sekarang mari kita jalankan kueri sederhana:

db. col. temukan({item:{$gt:12, $lt:65}});

Kueri terlihat cukup sederhana, karena kami menggunakan item non-array dengan rentang tetap. Saya berharap batas berpotongan Indeks menjadi sesuatu seperti item:[[12,65] ] untuk kueri, namun, jika Anda menjalankan penjelasan, Anda akan melihat ini:

"indexBounds" :{"item" :[ [ -Infinity, 65 ] ],"prices" :[ [ { "$minElement" :1 }, { "$maxElement" :1 } ] ]}, 

Alasannya adalah bahwa MongoDB mendeteksi bahwa ini adalah indeks multikey, dan tidak memproses persimpangan batas indeks, terlepas dari fakta bahwa kueri Anda tidak menggunakan bidang array apa pun. Moral dari cerita ini adalah ketika Anda mencampur bidang array dan non-array dalam indeks, selalu perhatikan batas persimpangan indeks Anda. Kemungkinannya tidak efisien.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. cara menanyakan objek anak di mongodb

  2. Kueri Mongodb dengan bidang dalam dokumen yang sama

  3. Mengelola MySQL, MongoDB &PostgreSQL dengan ChatOps dari Slack

  4. Bagaimana cara memvalidasi anggota bidang array?

  5. MongoDB:Cara menemukan dokumen dengan id di dalam dokumen bersarang