Metode find menyaring dokumen pada satu koleksi sesuai filter yang diberikan. Topik ini membahas penulisan filter kesetaraan, operator perbandingan seperti $gt dan $lte, operator $in beserta $nin, serta pemeriksaan keberadaan field dengan $exists. Seluruh contoh dijalankan pada koleksi buku di basis data perpustakaan, sehingga hasil setiap penyaringan dapat dibandingkan langsung dengan isinya.
Filter kesetaraan pada find#
Bentuk query paling dasar adalah kesetaraan, yaitu mencocokkan nilai field dengan satu nilai tertentu. Filter ditulis sebagai objek berisi pasangan nama field dan nilai yang diinginkan. MongoDB menafsirkan bentuk ini sebagai operator $eq, sehingga { tahun: 2021 } dan { tahun: { $eq: 2021 } } menghasilkan query yang sama. Apabila filter berisi beberapa field, seluruh syaratnya harus terpenuhi sekaligus, sehingga penggabungannya bersifat DAN.
Pilih basis data kerja terlebih dahulu, lalu siapkan data contoh dengan menyisipkan enam dokumen berikut.
use perpustakaanswitched to db perpustakaandb.buku.insertMany([
{ judul: "Algoritma Dasar", pengarang: "Dewi Kartika", tahun: 2021, stok: 4 },
{ judul: "Struktur Data", pengarang: "Budi Santoso", tahun: 2019, stok: 0 },
{ judul: "Basis Data Dokumen", pengarang: "Citra Melati", tahun: 2022, stok: 7 },
{ judul: "Jaringan Komputer", pengarang: "Ali Rahman", tahun: 2018, stok: 2 },
{ judul: "Pemrograman Python", pengarang: "Dewi Kartika", tahun: 2023 },
{ judul: "Statistika Terapan", pengarang: "Rina Wulandari", tahun: 2021 }
]){
acknowledged: true,
insertedIds: {
'0': ObjectId('6ae85e41014ce8c212ce5f47'),
'1': ObjectId('6ae85e41014ce8c212ce5f48'),
'2': ObjectId('6ae85e41014ce8c212ce5f49'),
'3': ObjectId('6ae85e41014ce8c212ce5f4a'),
'4': ObjectId('6ae85e41014ce8c212ce5f4b'),
'5': ObjectId('6ae85e41014ce8c212ce5f4c')
}
}Tampilkan seluruh isi koleksi untuk menjadi pembanding hasil penyaringan pada bagian berikutnya.
db.buku.find()[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f48'),
judul: 'Struktur Data',
pengarang: 'Budi Santoso',
tahun: 2019,
stok: 0
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f49'),
judul: 'Basis Data Dokumen',
pengarang: 'Citra Melati',
tahun: 2022,
stok: 7
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4a'),
judul: 'Jaringan Komputer',
pengarang: 'Ali Rahman',
tahun: 2018,
stok: 2
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4b'),
judul: 'Pemrograman Python',
pengarang: 'Dewi Kartika',
tahun: 2023
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4c'),
judul: 'Statistika Terapan',
pengarang: 'Rina Wulandari',
tahun: 2021
}
]Saring koleksi dengan satu syarat kesetaraan, lalu dengan dua syarat sekaligus.
db.buku.find({ tahun: 2021 })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4c'),
judul: 'Statistika Terapan',
pengarang: 'Rina Wulandari',
tahun: 2021
}
]db.buku.find({ pengarang: "Dewi Kartika", tahun: 2021 })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
}
]Query pertama mengembalikan dua dokumen yang terbit tahun 2021, sedangkan query kedua menyaring lebih ketat dengan menambahkan syarat pengarang. Hasilnya tinggal satu dokumen karena hanya dokumen itu yang memenuhi kedua syarat sekaligus. Perilaku penggabungan seperti ini menjadi dasar sebelum operator logika dipelajari lebih lanjut.
Operator perbandingan#
Operator perbandingan membandingkan nilai field dengan batas tertentu. Operator yang tersedia mencakup $gt untuk lebih besar, $gte untuk lebih besar atau sama, $lt untuk lebih kecil, $lte untuk lebih kecil atau sama, dan $ne untuk tidak sama dengan. Operator ditulis di dalam objek pada sisi nilai field, sehingga filter { tahun: { $gt: 2022 } } berarti mencari dokumen dengan tahun lebih besar dari 2022. Dua batas pada field yang sama dapat ditulis dalam satu objek yang sama, misalnya untuk membentuk rentang nilai.
db.buku.find({ tahun: { $gt: 2022 } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f4b'),
judul: 'Pemrograman Python',
pengarang: 'Dewi Kartika',
tahun: 2023
}
]db.buku.find({ tahun: { $gte: 2019, $lte: 2021 } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f48'),
judul: 'Struktur Data',
pengarang: 'Budi Santoso',
tahun: 2019,
stok: 0
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4c'),
judul: 'Statistika Terapan',
pengarang: 'Rina Wulandari',
tahun: 2021
}
]Query pertama hanya mengembalikan satu dokumen terbitan 2023, sedangkan query kedua mengembalikan seluruh buku terbitan 2019 sampai 2021. Rentang seperti ini tidak mungkin ditulis dengan kesetaraan biasa karena melibatkan dua batas sekaligus. Dalam praktiknya, rentang nilai menjadi bentuk penyaringan yang paling sering digunakan untuk angka dan tanggal.
Satu perilaku penting perlu diperhatikan ketika field yang disaring tidak dimiliki oleh semua dokumen. Field yang tidak ada tidak akan cocok dengan perbandingan mana pun, sehingga dokumen tanpa field stok tidak muncul pada filter berikut.
db.buku.find({ stok: { $gt: 0 } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f49'),
judul: 'Basis Data Dokumen',
pengarang: 'Citra Melati',
tahun: 2022,
stok: 7
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4a'),
judul: 'Jaringan Komputer',
pengarang: 'Ali Rahman',
tahun: 2018,
stok: 2
}
]Hasilnya hanya tiga dokumen, meskipun ada empat dokumen dengan nilai stok yang secara matematis memenuhi syarat. Dua dokumen tanpa field stok tersembunyi dari hasil tanpa menimbulkan pesan error apa pun.
Operator $in dan $nin#
Operator $in mencocokkan field dengan salah satu nilai di dalam daftar. Daftarnya ditulis sebagai array pada sisi nilai, sehingga satu filter menggantikan beberapa syarat kesetaraan sekaligus. Operator $nin merupakan kebalikannya, yaitu mencocokkan dokumen yang nilainya berada di luar daftar, termasuk dokumen yang tidak memiliki field tersebut.
db.buku.find({ pengarang: { $in: ["Dewi Kartika", "Ali Rahman"] } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f47'),
judul: 'Algoritma Dasar',
pengarang: 'Dewi Kartika',
tahun: 2021,
stok: 4
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4a'),
judul: 'Jaringan Komputer',
pengarang: 'Ali Rahman',
tahun: 2018,
stok: 2
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4b'),
judul: 'Pemrograman Python',
pengarang: 'Dewi Kartika',
tahun: 2023
}
]db.buku.find({ pengarang: { $nin: ["Dewi Kartika", "Ali Rahman"] } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f48'),
judul: 'Struktur Data',
pengarang: 'Budi Santoso',
tahun: 2019,
stok: 0
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f49'),
judul: 'Basis Data Dokumen',
pengarang: 'Citra Melati',
tahun: 2022,
stok: 7
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4c'),
judul: 'Statistika Terapan',
pengarang: 'Rina Wulandari',
tahun: 2021
}
]Kedua hasil saling melengkapi, yaitu tiga dokumen di dalam daftar dan tiga dokumen di luar daftar. Nilai pada daftar $in tidak harus bertipe sama, sehingga angka dan string boleh dicampur apabila memang sesuai data. Untuk daftar yang panjang, tulis setiap nilai pada baris tersendiri agar filter tetap mudah dibaca.
Operator $exists#
Operator $exists menyaring berdasarkan keberadaan field, bukan berdasarkan nilainya. Nilai true mengembalikan dokumen yang memiliki field tersebut, sedangkan false mengembalikan dokumen yang tidak memilikinya. Operator ini berguna karena dokumen pada MongoDB tidak wajib berstruktur sama, sehingga field tertentu dapat hilang pada sebagian dokumen.
db.buku.find({ stok: { $exists: false } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f4b'),
judul: 'Pemrograman Python',
pengarang: 'Dewi Kartika',
tahun: 2023
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4c'),
judul: 'Statistika Terapan',
pengarang: 'Rina Wulandari',
tahun: 2021
}
]db.buku.find({ stok: { $exists: true, $lt: 3 } })[
{
_id: ObjectId('6ae85e41014ce8c212ce5f48'),
judul: 'Struktur Data',
pengarang: 'Budi Santoso',
tahun: 2019,
stok: 0
},
{
_id: ObjectId('6ae85e41014ce8c212ce5f4a'),
judul: 'Jaringan Komputer',
pengarang: 'Ali Rahman',
tahun: 2018,
stok: 2
}
]Query pertama mengembalikan dua dokumen tanpa field stok, yaitu buku digital tanpa catatan persediaan. Query kedua menggabungkan $exists dengan $lt pada satu objek yang sama, sehingga hanya dokumen yang memiliki field stok dan bernilai di bawah tiga yang dikembalikan. Gabungan semacam ini mempersempit hasil tanpa perlu menambah tahap query terpisah.
Ringkasan#
- Filter kesetaraan ditulis sebagai pasangan field dan nilai, dan beberapa field dalam satu filter digabungkan sebagai DAN.
- Operator perbandingan
$gt,$gte,$lt,$lte, dan$neditulis pada sisi nilai field, dan dua batas dalam satu objek membentuk rentang. $inmencocokkan salah satu nilai dari daftar, sedangkan$ninmengembalikan dokumen di luar daftar, termasuk yang tidak memiliki field tersebut.$existsmenyaring keberadaan field, dan field yang tidak ada tidak pernah cocok dengan perbandingan mana pun.
Referensi#
- db.collection.find() — MongoDB Manual — Dokumentasi metode find beserta bentuk filter dan hasil kembaliannya.
- Query Documents — MongoDB Manual — Tutorial resmi penyaringan dokumen dengan operator query.
- $eq — MongoDB Manual — Dokumentasi operator kesetaraan $eq.
- $gt — MongoDB Manual — Dokumentasi operator perbandingan $gt beserta turunannya.
- $in — MongoDB Manual — Dokumentasi operator $in untuk pencocokan salah satu nilai.
- $exists — MongoDB Manual — Dokumentasi operator $exists untuk keberadaan field.