Harga buku naik, stok berubah, dan tim konten butuh daftar katalog lengkap — semua pertanyaan tersebut dijawab oleh satu method: find(). Method ini adalah operasi Read yang paling sering dipakai di MongoDB: kita serahkan sebuah filter yang menjelaskan document seperti apa yang dicari, dan MongoDB mengembalikan sebuah cursor untuk menjelajahi hasilnya. Chapter ini membedah bentuk panggilannya, perilaku cursor di REPL, dan perangkat bantu untuk mengolah hasil.

Peta materi Chapter ini:

  • Bentuk panggilan find() dengan filter kosong.
  • Cursor, iterasi otomatis 20 document pertama, dan pesan Type "it" for more.
  • Perangkat cursor: count(), forEach(), toArray(), serta pratinjau sort() dan limit().

Bentuk Panggilan dan Filter Kosong #

Bentuk umumnya: db.<collection>.find(<filter>, <proyeksi>). Kedua argumen opsional; kita fokus pada filter dulu, sedangkan proyeksi dibahas di Chapter findOne(). Mulai dari keadaan bersih lalu isi katalog:

js
use latihan_crud
db.buku.drop()

Output yang Dihasilkan:

text
switched to db latihan_crud
true
js
db.buku.insertMany([
  { judul: "Laut Bercerita", penulis: "Leila S. Chudori", harga: 98000, stok: 12, kategori: "fiksi", tag: ["fiksi", "sastra"], rating: 4.7 },
  { judul: "Bumi", penulis: "Tere Liye", harga: 89000, stok: 25, kategori: "fiksi", tag: ["fiksi", "remaja"], rating: 4.5 },
  { judul: "Filosofi Teras", penulis: "Henry Manampiring", harga: 89000, stok: 18, kategori: "nonfiksi", tag: ["filsafat", "pengembangan diri"], rating: 4.8 },
  { judul: "Atomic Habits", penulis: "James Clear", harga: 115000, stok: 30, kategori: "nonfiksi", tag: ["pengembangan diri", "terjemahan"], rating: 4.6 },
  { judul: "Sherlock Holmes", penulis: "Arthur Conan Doyle", harga: 75000, stok: 5, kategori: "fiksi", tag: ["detektif", "terjemahan"], rating: 4.4 },
  { judul: "Sang Pemimpi", penulis: "Andrea Hirata", harga: 65000, stok: 0, kategori: "fiksi", tag: ["fiksi", "sastra"], rating: 4.6 }
])

Output yang Dihasilkan:

text
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('6ad38653b4bdf647ecfee718'),
    '1': ObjectId('6ad38653b4bdf647ecfee719'),
    '2': ObjectId('6ad38653b4bdf647ecfee71a'),
    '3': ObjectId('6ad38653b4bdf647ecfee71b'),
    '4': ObjectId('6ad38653b4bdf647ecfee71c'),
    '5': ObjectId('6ad38653b4bdf647ecfee71d')
  }
}

Bentuk paling sederhana memakai kurung kosong — find() tanpa argumen sama dengan find({}), artinya tanpa syarat apa pun: semua document ikut serta.

js
db.buku.find()

Output yang Dihasilkan:

text
[
  {
    _id: ObjectId('6ad38653b4bdf647ecfee718'),
    judul: 'Laut Bercerita',
    penulis: 'Leila S. Chudori',
    harga: 98000,
    stok: 12,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'sastra' ],
    rating: 4.7
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee719'),
    judul: 'Bumi',
    penulis: 'Tere Liye',
    harga: 89000,
    stok: 25,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'remaja' ],
    rating: 4.5
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71a'),
    judul: 'Filosofi Teras',
    penulis: 'Henry Manampiring',
    harga: 89000,
    stok: 18,
    kategori: 'nonfiksi',
    tag: [ 'filsafat', 'pengembangan diri' ],
    rating: 4.8
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71b'),
    judul: 'Atomic Habits',
    penulis: 'James Clear',
    harga: 115000,
    stok: 30,
    kategori: 'nonfiksi',
    tag: [ 'pengembangan diri', 'terjemahan' ],
    rating: 4.6
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71c'),
    judul: 'Sherlock Holmes',
    penulis: 'Arthur Conan Doyle',
    harga: 75000,
    stok: 5,
    kategori: 'fiksi',
    tag: [ 'detektif', 'terjemahan' ],
    rating: 4.4
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71d'),
    judul: 'Sang Pemimpi',
    penulis: 'Andrea Hirata',
    harga: 65000,
    stok: 0,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'sastra' ],
    rating: 4.6
  }
]

Seluruh isi collection tampil sebagai array document, tercetak rapi field per baris. Ini perilaku istimewa REPL mongosh; sebenarnya find() tidak mengembalikan array — kita bedah apa yang sebenarnya terjadi setelah satu bagian berikutnya.

Filter pertama kita coba syarat paling sederhana: kesamaan satu field. Argumen pertama diisi object { kategori: "nonfiksi" }, dibaca “field kategori harus bernilai nonfiksi”:

js
db.buku.find({ kategori: "nonfiksi" })

Output yang Dihasilkan:

text
[
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71a'),
    judul: 'Filosofi Teras',
    penulis: 'Henry Manampiring',
    harga: 89000,
    stok: 18,
    kategori: 'nonfiksi',
    tag: [ 'filsafat', 'pengembangan diri' ],
    rating: 4.8
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71b'),
    judul: 'Atomic Habits',
    penulis: 'James Clear',
    harga: 115000,
    stok: 30,
    kategori: 'nonfiksi',
    tag: [ 'pengembangan diri', 'terjemahan' ],
    rating: 4.6
  }
]

Hanya dua document nonfiksi yang kembali. Filter adalah bahasa besar tersendiri — kesamaan beberapa field, field bersarang, sampai array — dan dibahas tuntas di Chapter Query Filters; dua Chapter setelahnya menambah operator perbandingan dan logika. Satu perilaku REPL yang perlu diantisipasi sejak awal: bila filter tidak cocok dengan satu document pun, find() tidak mencetak apa-apa — bukan array kosong, melainkan benar-benar tanpa keluaran. Di sesi interaktif, layar yang diam itu adalah jawaban sah dari MongoDB.

Cursor dan Batas 20 Document #

Yang dikembalikan find() sebenarnya adalah cursor: sebuah penunjuk ke hasil query di server, bukan salinan datanya. Saat kita mengetik db.buku.find() di REPL, mongosh memanfaatkan cursor itu untuk menarik dan mencetak document secara bertahap — maksimal 20 document per layar. Dengan enam buku semuanya masih muat, jadi tambah beberapa seri ringkas untuk melihat batasnya:

js
db.buku.insertMany([
  { _id: "s01", judul: "Seri Petualangan 01", harga: 15000 },
  { _id: "s02", judul: "Seri Petualangan 02", harga: 15500 },
  { _id: "s03", judul: "Seri Petualangan 03", harga: 16000 },
  { _id: "s04", judul: "Seri Petualangan 04", harga: 16500 },
  { _id: "s05", judul: "Seri Petualangan 05", harga: 17000 },
  { _id: "s06", judul: "Seri Petualangan 06", harga: 17500 },
  { _id: "s07", judul: "Seri Petualangan 07", harga: 18000 },
  { _id: "s08", judul: "Seri Petualangan 08", harga: 18500 },
  { _id: "s09", judul: "Seri Petualangan 09", harga: 19000 },
  { _id: "s10", judul: "Seri Petualangan 10", harga: 19500 },
  { _id: "s11", judul: "Seri Petualangan 11", harga: 20000 },
  { _id: "s12", judul: "Seri Petualangan 12", harga: 20500 },
  { _id: "s13", judul: "Seri Petualangan 13", harga: 21000 },
  { _id: "s14", judul: "Seri Petualangan 14", harga: 21500 },
  { _id: "s15", judul: "Seri Petualangan 15", harga: 22000 },
  { _id: "s16", judul: "Seri Petualangan 16", harga: 22500 }
])

Output yang Dihasilkan:

text
{
  acknowledged: true,
  insertedIds: {
    '0': 's01',
    '1': 's02',
    '2': 's03',
    '3': 's04',
    '4': 's05',
    '5': 's06',
    '6': 's07',
    '7': 's08',
    '8': 's09',
    '9': 's10',
    '10': 's11',
    '11': 's12',
    '12': 's13',
    '13': 's14',
    '14': 's15',
    '15': 's16'
  }
}

Collection kini berisi 22 document — seri ringkas sengaja memakai _id pendek seperti s01 agar keluaran mudah dibaca. Panggil find() lagi:

js
db.buku.find()

Output yang Dihasilkan:

text
[
  {
    _id: ObjectId('6ad38653b4bdf647ecfee718'),
    judul: 'Laut Bercerita',
    penulis: 'Leila S. Chudori',
    harga: 98000,
    stok: 12,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'sastra' ],
    rating: 4.7
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee719'),
    judul: 'Bumi',
    penulis: 'Tere Liye',
    harga: 89000,
    stok: 25,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'remaja' ],
    rating: 4.5
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71a'),
    judul: 'Filosofi Teras',
    penulis: 'Henry Manampiring',
    harga: 89000,
    stok: 18,
    kategori: 'nonfiksi',
    tag: [ 'filsafat', 'pengembangan diri' ],
    rating: 4.8
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71b'),
    judul: 'Atomic Habits',
    penulis: 'James Clear',
    harga: 115000,
    stok: 30,
    kategori: 'nonfiksi',
    tag: [ 'pengembangan diri', 'terjemahan' ],
    rating: 4.6
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71c'),
    judul: 'Sherlock Holmes',
    penulis: 'Arthur Conan Doyle',
    harga: 75000,
    stok: 5,
    kategori: 'fiksi',
    tag: [ 'detektif', 'terjemahan' ],
    rating: 4.4
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71d'),
    judul: 'Sang Pemimpi',
    penulis: 'Andrea Hirata',
    harga: 65000,
    stok: 0,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'sastra' ],
    rating: 4.6
  },
  { _id: 's01', judul: 'Seri Petualangan 01', harga: 15000 },
  { _id: 's02', judul: 'Seri Petualangan 02', harga: 15500 },
  { _id: 's03', judul: 'Seri Petualangan 03', harga: 16000 },
  { _id: 's04', judul: 'Seri Petualangan 04', harga: 16500 },
  { _id: 's05', judul: 'Seri Petualangan 05', harga: 17000 },
  { _id: 's06', judul: 'Seri Petualangan 06', harga: 17500 },
  { _id: 's07', judul: 'Seri Petualangan 07', harga: 18000 },
  { _id: 's08', judul: 'Seri Petualangan 08', harga: 18500 },
  { _id: 's09', judul: 'Seri Petualangan 09', harga: 19000 },
  { _id: 's10', judul: 'Seri Petualangan 10', harga: 19500 },
  { _id: 's11', judul: 'Seri Petualangan 11', harga: 20000 },
  { _id: 's12', judul: 'Seri Petualangan 12', harga: 20500 },
  { _id: 's13', judul: 'Seri Petualangan 13', harga: 21000 },
  { _id: 's14', judul: 'Seri Petualangan 14', harga: 21500 }
]
Type "it" for more

Tepat 20 document dicetak, lalu shell berhenti dengan pesan Type "it" for more di baris terakhir. Dua document tersisa masih menunggu di cursor. Lanjutkan dengan satu kata:

js
it

Output yang Dihasilkan:

text
[
  { _id: 's15', judul: 'Seri Petualangan 15', harga: 22000 },
  { _id: 's16', judul: 'Seri Petualangan 16', harga: 22500 }
]

Perangkat Cursor #

Sebelum mengolah hasil, ketahui dulu ukurannya. Method count() menghitung document yang cocok tanpa mencetak isinya — berfungsi juga sebagai cara paling cepat membuktikan bahwa sebuah query memang tidak menemukan apa pun:

js
db.buku.find().count()
db.buku.find({ kategori: "nonfiksi" }).count()

Output yang Dihasilkan:

text
22
2

Untuk memproses setiap hasil satu per satu, forEach() menerima satu fungsi yang dijalankan per document — pola yang sudah kita kenal dari Chapter Helper Methods:

js
db.buku.find({ kategori: "fiksi" }).forEach(buku => print(buku.judul))

Output yang Dihasilkan:

text
Laut Bercerita
Bumi
Sherlock Holmes
Sang Pemimpi

Bila hasil perlu dipakai berulang kali sebagai array JavaScript, toArray() mengubah cursor menjadi array biasa:

js
const bukuFiksi = db.buku.find({ kategori: "fiksi" }).toArray()
bukuFiksi.length

Output yang Dihasilkan:

text
4

Dua method terakhir mengatur urutan dan jumlah hasil: sort() mengurutkan berdasarkan field — -1 menurun, 1 menaik — dan limit() memotong jumlahnya. Ini pratinjau; keduanya kita pakai penuh pada Chapter-Chapter update:

js
db.buku.find().sort({ harga: -1 }).limit(2)

Output yang Dihasilkan:

text
[
  {
    _id: ObjectId('6ad38653b4bdf647ecfee71b'),
    judul: 'Atomic Habits',
    penulis: 'James Clear',
    harga: 115000,
    stok: 30,
    kategori: 'nonfiksi',
    tag: [ 'pengembangan diri', 'terjemahan' ],
    rating: 4.6
  },
  {
    _id: ObjectId('6ad38653b4bdf647ecfee718'),
    judul: 'Laut Bercerita',
    penulis: 'Leila S. Chudori',
    harga: 98000,
    stok: 12,
    kategori: 'fiksi',
    tag: [ 'fiksi', 'sastra' ],
    rating: 4.7
  }
]

Dua buku termahal tampil di depan. Kedua method ini dirantai langsung ke cursor sebelum data ditarik, sehingga pengurutan dan pemotongan terjadi di server — bukan di memori shell. Pola sort() lalu limit() juga mengecilkan pekerjaan jaringan: hanya hasil akhirnya yang dikirim ke klien.

Terakhir, soal .pretty(): keluaran mongosh memang sudah rapi sejak awal, jadi method tersebut tinggal kompatibilitas kebiasaan dari shell lama mongo — perbandingan lengkapnya ada di Chapter Helper Methods.

Sebagai penutup, bersihkan database latihan:

js
db.dropDatabase()

Output yang Dihasilkan:

text
{ ok: 1, dropped: 'latihan_crud' }

Rangkuman #

  • Bentuk panggilan: db.<collection>.find(<filter>, <proyeksi>); find() dan find({}) mengembalikan semua document.
  • Filter kesamaan sederhana ditulis { field: nilai }; pembahasan lengkapnya di Chapter Query Filters.
  • find() mengembalikan cursor; REPL mencetak maksimal 20 document lalu menampilkan Type "it" for more — ketik it untuk melanjutkan.
  • count() menghitung hasil, forEach() memproses per document, toArray() mengubah cursor menjadi array.
  • sort() mengurutkan hasil dan limit() memotong jumlahnya; .pretty() tidak lagi diperlukan di mongosh.

Cursor sudah kita genggam. Chapter berikutnya memperkenalkan saudara terdekatnya — findOne() — untuk kasus ketika satu document saja sudah cukup.