Ini selalu dimungkinkan dengan MongoDB karena selalu ada kemampuan untuk membuat kondisi kueri menggunakan Evaluasi JavaScript :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Di mana itu akan mengembalikan dokumen yang cocok dengan kondisi di sini dengan benar dengan mencari kemungkinan kunci dalam dokumen untuk nilai yang diperlukan.
Tapi itu bukan pertanyaan tentang "mungkin", tetapi lebih dari satu "apakah ini benar-benar ide yang bagus" , yang jawaban dasarnya adalah "Tidak".
Basis data adalah binatang yang berubah-ubah yang suka mengoptimalkan dengan hal-hal seperti indeks dan semacamnya, serta set operator yang diharapkan untuk membuat pencarian seefisien mungkin untuk digunakan. Jadi ya, Anda dapat menggunakan penerjemah bahasa yang secara efektif mengevaluasi kondisi kode di setiap dokumen, atau Anda dapat mempertimbangkan kembali pola desain Anda.
Basis data menyukai "pesanan", jadi berikan beberapa, karena ada struktur ulang terorganisir sederhana untuk data yang Anda usulkan:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Diatur sedemikian rupa sehingga kueri menjadi sesederhana:
db.attrs.find({ "attrs.value": "14" })
Dan tentu saja dapat mendukung dan menggunakan indeks pada salah satu properti subdokumen dalam larik tersebut.
Bagaimanapun, MongoDB adalah "basis data", dan seperti semua basis data, MongoDB paling memperhatikan "nilai" propertinya daripada mencari menggunakan nama "kunci" itu. Jadi hal-hal yang mewakili "data" yang bermakna tidak boleh menjadi bagian dari nama "kunci", melainkan harus menjadi "nilai" dari "kunci" sebagai "pengidentifikasi", seperti yang ditunjukkan di atas.
Memiliki jalur yang konsisten ke data yang ingin Anda kueri adalah cara optimal untuk bekerja dengan data di dalam MongoDB. Menggunakan struktur di mana nama kunci terus berubah, tidak dapat dilalui oleh apa pun selain menjalankan kode, dan itu jauh lebih lambat dan lebih buruk untuk kinerja daripada menggunakan operasi dan fasilitas asli seperti indeks.