Field array muncul di hampir semua schema: daftar tag pada buku, daftar ukuran pada produk, daftar kategori pada artikel. MongoDB punya satu aturan mesin yang menggerakkan semua query array — memahaminya menjelaskan sekaligus kenapa query tertentu menemukan lebih banyak atau lebih sedikit hasil dari dugaan. Chapter ini menyusun aturan itu secara sistematis: pencocokan array utuh, pencocokan per elemen, dan penjangkauan posisi, lalu memetakan kapan memakai operator array yang telah kita pelajari di Section CRUD.

Peta materi Chapter ini:

  • Mekanisme pencocokan kondisi terhadap elemen array.
  • Kesamaan array utuh (elemen, urutan, panjang).
  • Peta lengkap kebutuhan query array beserta operatornya.

Mekanisme Dasar: Setiap Kondisi Diperiksa per Elemen #

Siapkan data uji dengan variasi panjang dan isi array:

js
use latihan_query
db.buku.drop()

Output yang Dihasilkan:

text
switched to db latihan_query
true
js
db.buku.insertMany([
  { judul: "Laut Bercerita", penulis: "Leila S. Chudori", harga: 98000, kategori: "fiksi", tag: ["fiksi", "sastra", "pengarang Indonesia"] },
  { judul: "Bumi", penulis: "Tere Liye", harga: 89000, kategori: "fiksi", tag: ["fiksi", "remaja"] },
  { judul: "Filosofi Teras", penulis: "Henry Manampiring", harga: 89000, kategori: "nonfiksi", tag: ["nonfiksi", "filsafat", "pengembangan diri"] },
  { judul: "Atomic Habits", penulis: "James Clear", harga: 115000, kategori: "nonfiksi", tag: ["nonfiksi", "pengembangan diri", "terjemahan"] },
  { judul: "Kamus Bahasa Indonesia", penulis: "Badan Bahasa", harga: 55000, kategori: "referensi", tag: ["referensi"] }
])

Output yang Dihasilkan:

text
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('6ad390ae7cfbc8a561a294f4'),
    '1': ObjectId('6ad390ae7cfbc8a561a294f5'),
    '2': ObjectId('6ad390ae7cfbc8a561a294f6'),
    '3': ObjectId('6ad390ae7cfbc8a561a294f7'),
    '4': ObjectId('6ad390ae7cfbc8a561a294f8')
  }
}

Aturan mesinnya satu kalimat: saat nilai kondisi bukan array, MongoDB menguji kondisi itu terhadap array itu sendiri dan setiap elemennya — document cocok bila salah satu pengujian berhasil. Karena itu, nilai tunggal bisa menemukan document yang menyimpan array:

js
db.buku.find({ tag: "fiksi" }, { _id: 0, judul: 1 })

Output yang Dihasilkan:

text
[ { judul: 'Laut Bercerita' }, { judul: 'Bumi' } ]

Laut Bercerita dan Bumi lolos karena satu di antara elemen tag-nya bernilai "fiksi" — elemen lain boleh berupa apa pun. Inilah pola paling umum untuk array: cukup tulis nilainya, dan array berisi nilai tersebut otomatis cocok.

Kesamaan Array Utuh #

Menuliskan array sebagai nilai filter mengubah maknanya: sekarang array itu sendiri yang dicocokkan secara utuh — elemen sama, urutan sama, panjang sama:

js
db.buku.find({ tag: ["nonfiksi", "pengembangan diri", "terjemahan"] }, { _id: 0, judul: 1, tag: 1 })

Output yang Dihasilkan:

text
[
  {
    judul: 'Atomic Habits',
    tag: [ 'nonfiksi', 'pengembangan diri', 'terjemahan' ]
  }
]

Atomic Habits lolos karena urutan ketiga tag-nya persis seperti pada filter. Dua variasi berikut sama-sama gagal menemukannya:

js
db.buku.find({ tag: ["terjemahan", "pengembangan diri", "nonfiksi"] }, { _id: 0, judul: 1 }).toArray()
db.buku.find({ tag: ["nonfiksi", "pengembangan diri"] }, { _id: 0, judul: 1 }).toArray()

Output yang Dihasilkan:

text
[]
[]

Mari kita bedah dua kegagalannya:

  1. Baris pertama (urutan dibalik): elemennya sama tiga-tiga, tetapi BSON membandingkan array sebagai barisan berurut — ["terjemahan", ...] bukan ["nonfiksi", ...].
  2. Baris kedua (subset): dua nilai memang ada di dalam tag milik Atomic Habits, tetapi kesamaan utuh menuntut array berisi tepat tiga elemen itu, bukan dua.

Kesamaan utuh adalah alat yang tepat hanya saat definisi datanya memang ketat — misalnya field warna yang selalu berisi pasangan tetap. Untuk “memuat semua nilai ini tanpa peduli urutan dan anggota lain”, operator $all dari Chapter Array Query Operators adalah jawabannya.

Peta Kebutuhan Query Array #

Lima chapter terakhir memperkenalkan satu per satu alat query array. Tabel berikut merangkumnya sekaligus sebagai rujukan cepat:

KebutuhanBentuk queryDibahas di
Memuat satu nilai{ tag: "fiksi" }Chapter ini
Array sama persis (urutan + panjang){ tag: ["a", "b"] }Chapter ini
Memuat semua nilai, urutan bebas{ tag: { $all: ["a", "b"] } }Array Query Operators
Berisi tepat N elemen{ tag: { $size: 3 } }Array Query Operators
Satu elemen memenuhi beberapa kondisi{ skor: { $elemMatch: { ... } } }Chapter berikutnya
Elemen pada posisi tertentu{ "tag.0": "fiksi" }Querying Nested Fields

Penjangkauan posisi "tag.0" sudah dibahas penuh di Chapter Querying Nested Fields, dan $elemMatch untuk array of documents sudah dicicipi lewat field ulasan di Section CRUD. Chapter berikutnya menyempurnakan yang terakhir: $elemMatch pada array nilai biasa, lengkap dengan jebakan klasiknya.

Rangkuman #

  • Kondisi bernilai tunggal diuji terhadap array itu sendiri dan setiap elemennya; satu elemen cocok sudah cukup.
  • Array sebagai nilai filter berarti kesamaan utuh: elemen, urutan, dan panjang harus sama persis.
  • Urutan dibalik atau subset tidak cocok untuk kesamaan utuh — gunakan $all untuk memuat semua nilai secara bebas.
  • Tabel peta di atas merangkum alat query array beserta chapter pembahasannya.