insertOne dan insertMany

Menyisipkan dokumen baru dengan insertOne dan insertMany, termasuk perilaku _id yang dihasilkan otomatis.

Daftar isi

Topik ini membahas dua metode penyisipan dokumen pada MongoDB, yaitu insertOne untuk satu dokumen dan insertMany untuk banyak dokumen sekaligus. Pembahasan mencakup hasil kembalian kedua metode, perilaku _id yang dibuat otomatis, serta penanganan _id ganda. Seluruh contoh menggunakan basis data perpustakaan dengan koleksi buku, dan setiap blok perintah diketik di dalam sesi mongosh.

Menyisipkan satu dokumen dengan insertOne#

Metode insertOne menyisipkan satu dokumen baru ke dalam satu koleksi. Koleksi tidak perlu dibuat terlebih dahulu karena MongoDB membuat koleksi secara otomatis pada penyisipan pertama. Argumen metode ini berupa satu objek dokumen yang berisi pasangan field dan nilai. Hasil kembaliannya berupa objek yang menyatakan status penulisan beserta nilai _id dokumen baru.

Isi dokumen tidak harus seragam antara satu dokumen dengan dokumen lainnya. Nilai field dapat berupa string, angka, nilai boolean, tanggal, array, maupun dokumen lain yang bersarang di dalam dokumen. Kelenturan ini menjadi ciri model dokumen MongoDB, meskipun struktur data tetap sebaiknya dijaga konsisten agar data mudah disaring dan dibaca ulang. Di dalam server, penyimpanannya diatur oleh BSON, yaitu format biner yang dipakai MongoDB untuk menyimpan dokumen.

Jalankan mongosh dari terminal terlebih dahulu. Setelah shell siap, pilih basis data perpustakaan sebelum perintah penyisipan diketik.

bash
# tidak-dijalankan
# menjalankan shell mongosh dari terminal
mongosh
mongosh
use perpustakaan
text Keluaran
switched to db perpustakaan

Sisipkan satu dokumen buku dengan perintah berikut.

mongosh
db.buku.insertOne({
  judul: "Algoritma dan Pemrograman",
  pengarang: "Dewi Kartika",
  tahun: 2021,
  stok: 4
})
text Keluaran
{
  acknowledged: true,
  insertedId: ObjectId('6ae85c7b069cf96f32ce5f47')
}

Nilai acknowledged: true menandakan server telah menerima penulisan tersebut. Nilai insertedId berupa _id dokumen yang baru saja tersimpan. Penulisan perintah dalam beberapa baris hanya demi keterbacaan. Alasannya, mongosh terus membaca input hingga tanda kurung penutup diketik, kemudian mengeksekusinya sebagai satu pernyataan utuh.

Perilaku _id yang dihasilkan otomatis#

Setiap dokumen pada MongoDB wajib memiliki field _id yang nilainya unik di dalam koleksinya. Apabila dokumen disisipkan tanpa _id, server membuat nilai ObjectId secara otomatis. ObjectId memuat penanda waktu pembuatan beserta komponen acak, sehingga nilainya berbeda untuk setiap dokumen. Field _id berperan sebagai kunci utama karena MongoDB membuat indeks unik bernama _id_ pada setiap koleksi.

Periksa dokumen yang baru disisipkan untuk melihat _id hasil pembuatan otomatis.

mongosh
db.buku.findOne({ judul: "Algoritma dan Pemrograman" })
text Keluaran
{
  _id: ObjectId('6ae85c7b069cf96f32ce5f47'),
  judul: 'Algoritma dan Pemrograman',
  pengarang: 'Dewi Kartika',
  tahun: 2021,
  stok: 4
}

Nilai _id juga boleh diisi sendiri apabila aplikasi memiliki penanda yang sudah bermakna, misalnya kode katalog. Penulisan _id dilakukan seperti field lainnya, yaitu di dalam dokumen yang disisipkan, dan nilainya langsung terlihat pada hasil kembalian.

mongosh
db.buku.insertOne({ _id: "bk-001", judul: "Jaringan Komputer", pengarang: "Ali Rahman", tahun: 2022, stok: 2 })
text Keluaran
{ acknowledged: true, insertedId: 'bk-001' }

Penyisipan berikutnya dengan nilai _id yang sama akan ditolak server. Perintahnya identik dengan penyisipan sebelumnya, sehingga kegagalan murni disebabkan oleh tabrakan _id.

mongosh
db.buku.insertOne({ _id: "bk-001", judul: "Jaringan Komputer", pengarang: "Ali Rahman", tahun: 2022, stok: 2 })
text Keluaran
Uncaught
MongoServerError: E11000 duplicate key error collection: perpustakaan.buku index: _id_ dup key: { _id: "bk-001" }

Pesan error E11000 duplicate key error muncul karena nilai _id bertabrakan dengan dokumen yang sudah ada. Server menolak seluruh penulisan tersebut sehingga tidak ada dokumen baru yang tersimpan. Perilaku ini menjaga keunikan kunci utama pada setiap koleksi.

Keunikan _id juga memudahkan penunjukan satu dokumen secara pasti. Perintah pembaruan dan penghapusan biasanya menyaring dokumen lewat _id apabila dokumen yang dituju sudah diketahui. Karena itu, menyimpan nilai insertedId dari hasil penyisipan merupakan kebiasaan yang berguna ketika dokumen baru perlu diakses kembali.

Menyisipkan banyak dokumen dengan insertMany#

Metode insertMany menyisipkan beberapa dokumen dalam satu kali pemanggilan. Argumennya berupa satu array yang setiap elemennya berupa satu dokumen. Hasil kembaliannya memuat field insertedIds berupa pemetaan dari posisi elemen ke nilai _id yang dibuat. Dibandingkan pemanggilan insertOne berulang kali, metode ini lebih efisien karena komunikasi dengan server hanya terjadi satu kali.

Sisipkan delapan judul buku sekaligus dengan perintah berikut.

mongosh
db.buku.insertMany([
  { judul: "Struktur Data Dasar", pengarang: "Budi Santoso", tahun: 2020, stok: 3 },
  { judul: "Basis Data Relasional", pengarang: "Citra Melati", tahun: 2019, stok: 5 },
  { judul: "Sistem Operasi Modern", pengarang: "Dewi Kartika", tahun: 2018, stok: 6 },
  { judul: "Pemrograman Web", pengarang: "Budi Santoso", tahun: 2023, stok: 4 },
  { judul: "Keamanan Informasi", pengarang: "Rina Wulandari", tahun: 2021, stok: 1 },
  { judul: "Kecerdasan Buatan Terapan", pengarang: "Citra Melati", tahun: 2022, stok: 3 },
  { judul: "Rekayasa Perangkat Lunak", pengarang: "Ali Rahman", tahun: 2020, stok: 7 },
  { judul: "Statistika untuk Komputasi", pengarang: "Rina Wulandari", tahun: 2019, stok: 2 }
])
text Keluaran
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('6ae85c7b069cf96f32ce5f48'),
    '1': ObjectId('6ae85c7b069cf96f32ce5f49'),
    '2': ObjectId('6ae85c7b069cf96f32ce5f4a'),
    '3': ObjectId('6ae85c7b069cf96f32ce5f4b'),
    '4': ObjectId('6ae85c7b069cf96f32ce5f4c'),
    '5': ObjectId('6ae85c7b069cf96f32ce5f4d'),
    '6': ObjectId('6ae85c7b069cf96f32ce5f4e'),
    '7': ObjectId('6ae85c7b069cf96f32ce5f4f')
  }
}

Pastikan jumlah dokumen pada koleksi dengan perintah berikut.

mongosh
db.buku.countDocuments()
text Keluaran
10

Hasil penghitungan berjumlah sepuluh karena koleksi sudah memuat dua dokumen dari bagian sebelumnya, sedangkan penyisipan _id ganda tidak menambah apa pun.

Secara default, insertMany menulis dokumen secara terurut (ordered), yaitu satu per satu mengikuti urutan array. Apabila satu dokumen gagal, misalnya karena _id ganda, dokumen-dokumen setelahnya tidak disisipkan. Pilihan ordered: false membuat server tetap mencoba sisa dokumen meskipun ada yang gagal, dan hasil kembaliannya melaporkan kesalahan setiap dokumen yang gagal.

Pemilihan antara kedua metode mengikuti kebutuhan. Gunakan insertOne apabila dokumen dibuat satu per satu dari interaksi aplikasi, misalnya satu catatan peminjaman baru. Gunakan insertMany apabila banyak dokumen perlu dibuat sekaligus, misalnya memuat data awal atau menyalin data dari sumber lain.

Ringkasan#

  • insertOne menyisipkan satu dokumen dan mengembalikan _id dokumen baru, sedangkan insertMany menyisipkan banyak dokumen sekaligus dan mengembalikan pemetaan insertedIds.
  • Tanpa _id, server membuat ObjectId otomatis, dan keunikan _id dijaga oleh indeks unik _id_ pada setiap koleksi.
  • Penyisipan dengan _id ganda menghasilkan error E11000 duplicate key error dan tidak menyimpan dokumen apa pun.
  • Secara bawaan insertMany berperilaku terurut sehingga satu kegagalan menghentikan sisa daftar, sedangkan ordered: false membuat sisa daftar tetap dicoba.

Referensi#