Bagaimana cara mengindeks atribut dinamis di MongoDB

8

Saya memiliki jenis data berikut (disederhanakan sedikit dari kasus asli saya) di MongoDB:

{
    "name":"some name",
    "attrs":[
        {"n":"subject","v":"Some subject"},
        {"n":"description","v":"Some great description"},
        {"n":"comments","v":"Comments are here!"},
        ]
}

Array attrs adalah wadah untuk atribut dinamis, yaitu saya sebelumnya tidak tahu apa jenis atribut yang diletakkan di sana. n singkatan nama dan v singkatan nilai.

Buku MongoDB In Action menggambarkan ini sebagai solusi untuk memiliki atribut dinamis dalam kasus di mana atribut benar-benar dapat diprediksi. Ini juga menjelaskan bahwa Anda dapat mengindeks seperti ini:

db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})

Pertanyaan kemudian dapat dilakukan seperti ini:

db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})

Ketika saya menguji ini, saya mendapatkan kinerja yang sangat buruk. Saya diuji dengan koleksi saya memiliki 2 juta dokumen dan tidak memiliki indeks tampaknya berkinerja lebih baik.

Jadi, pertanyaannya, apakah ada cara untuk mengindeks pengaturan atribut dinamis semacam ini sehingga pengindeksan memberikan kinerja yang baik? Dalam kasus saya, tidak layak hanya memiliki kunci seperti "subjek" dan "deskripsi" dan mengindeks semuanya ...

Kaitsu
sumber

Jawaban:

5

Saya juga mengajukan pertanyaan yang sama (dalam bentuk yang sedikit diperluas) pada milis mongodb-user , di mana saya mendapat jawaban. Baca dari sana untuk mendapatkan detail lebih lanjut. Jawaban singkatnya adalah, bahwa strategi yang digunakan dalam pertanyaan harus bekerja dengan baik, tetapi ada masalah yang membuatnya sangat tidak efisien. Semoga masalah ini segera diperbaiki.

Untuk kasus saya, saya hanya perlu menanyakan kecocokan yang tepat untuk tuple {n, v}, sehingga saya dapat membuat indeks multikey:

db.mycollection.ensureIndex({"attrs":1})

dan membuat mereka meminta seperti ini:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

yang berfungsi dengan baik dan menggunakan indeks dengan sangat efektif.

Kaitsu
sumber
0

Pertanyaan yang sama ditanyakan di sini . Mulai versi 4.2 MongoDB, mereka mengumumkan indeks wildcard. Berikut ini sebuah contoh:

db.myCollection.createIndex( { "subdocument.$**": 1 } );
Alisettar Huseynli
sumber