Bekerja dengan array sebagai nilai di MongoDB

Tidak seperti model database relasional, dokumen MongoDB dapat memiliki kolom yang memiliki nilai sebagai array. Contoh prototipe di hampir semua dokumentasi MongoDB adalah dokumen yang memiliki tagskolom, yang nilainya berupa array string, seperti ["NoSQL", "Ruby", "MongoDB"]. Jika Anda berasal dari dunia relasional (yang kebanyakan dari kita) maka fitur ini, pada pandangan pertama, agak menakutkan.

Misalnya, sebagian besar kueri, terlepas dari struktur data yang mendasarinya (baik itu tabel relasional, dokumen JSON, kamus, dll) menargetkan nilai dan bukan kunci itu sendiri. Menggunakan dokumen yang disebutkan di atas yang berisi tagsbidang dengan larik sebagai nilainya, tidak banyak nilai dalam kueri pada kunci tags- kueri menargetkan nilai kunci. Jadi dalam hal ini, pertanyaan yang diajukan berupa “dokumen apa yang mengandung tag X”, yang cukup mudah dikonseptualisasikan bila nilainya singular (ie select * from document where tag = X).

Namun, ketika nilai kunci menjadi jamak seperti dalam kasus di atas, terkadang saya bertanya-tanya bagaimana cara membuat kueri ketika saya hanya mengetahui sebagian dari nilai yang tersedia. Misalnya, berikut adalah dokumen sederhana dengan dua bidang:

{a:"foo", b:[10,20,30]} 

Dalam hal ini, bidang bmemiliki larik angka sebagai nilai. Saya akan menambahkan dokumen ini bersama dengan beberapa dokumen lainnya ke koleksi Mongo yang dijuluki foo_test.

> db.foo_test.save({a:"foo", b:[10,20,30]}) > db.foo_test.save({a:"foo", b:[15,25,35]}) > db.foo_test.save({a:"foo", b:[10,40,50]}) > db.foo_test.save({a:"bar", b:[10,60,70]}) 

Dengan dokumen-dokumen itu dibuat, pertanyaannya menjadi, bagaimana Anda menemukan semua dokumen yang memiliki nilai 10 b?

Karena itu tas Mongo, sayang, ternyata simpel tanpa susah payah. Kueri saja nilainya seolah-olah nilainya tunggal!

> db.foo_test.find({"b":10}) { "_id" : ObjectId("4dd56bc747cc1d1360674d73"), "a" : "foo", "b" : [ 10, 20, 30 ] } { "_id" : ObjectId("4dd56be347cc1d1360674d75"), "a" : "foo", "b" : [ 10, 40, 50 ] } { "_id" : ObjectId("4dd56bee47cc1d1360674d76"), "a" : "bar", "b" : [ 10, 60, 70 ] } 

Bagaimana jika Anda ingin sedikit lebih kemahiran, seperti menemukan nilai-nilai yang berbeda dari amana bmemiliki nilai 10? Semudah itu, sayang.

> db.foo_test.distinct("a", {"b":10}) [ "bar", "foo" ] 

Satu hal yang perlu diperhatikan: Anda dapat, dan mungkin harus (jika Anda berencana untuk banyak mencari nilai array dan akan ada banyak dokumen) menambahkan indeks ke b. Meskipun ini mungkin memperlambat penyisipan (karena indeks perlu diperbarui setiap kali) kemungkinan besar akan meningkatkan pembacaan.

> db.foo_test.ensureIndex({b:1}) 

Array sebagai nilai dalam dokumen MongoDB mungkin terlihat aneh saat Anda memikirkan cara mengajukan kueri terhadapnya. Tapi ternyata, mereka tidak terlalu buruk dan Anda dapat bertindak melawan mereka seolah-olah itu adalah nilai tunggal. Tidak buruk jika Anda bertanya kepada saya.

Artikel ini, "Bekerja dengan array sebagai nilai di MongoDB" aslinya diterbitkan oleh JavaWorld.