CRUD — Create, Read, Update, Delete — adalah empat operasi dasar pengelolaan data, dan di MongoDB semuanya berawal dari Create: insertOne(). Setiap buku baru yang masuk ke katalog toko buku online kita, entah judul baru dari penerbit atau edisi cetak ulang, berawal dari satu panggilan method ini. Chapter ini membedah bentuk panggilannya, cara membaca hasil tulis yang dikembalikan server, serta dua skenario penting: memilih _id sendiri dan menabrak _id yang sudah dipakai.
Peta materi Chapter ini:
- Bentuk panggilan
insertOne()beserta artiacknowledgeddaninsertedId. _idotomatis (ObjectId) versus_idmanual.- Penolakan
_idduplikat lewat galatE11000. - Collection yang dibuat otomatis pada insert pertama.
Bentuk Panggilan dan Hasilnya #
Bentuk umumnya ringkas: db.<collection>.insertOne(<document>). Bagian db.buku menunjuk collection buku di database aktif, dan argumennya adalah satu object berisi field serta nilai yang hendak disimpan. Seperti biasa, kita mulai dari keadaan bersih agar hasil contoh selalu sama:
use latihan_crud
db.buku.drop()Output yang Dihasilkan:
switched to db latihan_crud
truedrop() membuang collection buku bila ada, dan aman dijalankan walau collection belum pernah dibuat. Sekarang simpan buku pertama kita:
db.buku.insertOne({
judul: "Laut Bercerita",
penulis: "Leila S. Chudori",
harga: 98000,
stok: 12,
kategori: "fiksi",
tag: ["fiksi", "sastra"],
rating: 4.7
})Output yang Dihasilkan:
{
acknowledged: true,
insertedId: ObjectId('6ad3854b76641838db17d002')
}Balasan ini bertipe InsertOneResult dan hanya memuat dua field — ringkas memang, karena method ini memang dirancang untuk satu pekerjaan tunggal. Mari kita bedah keduanya:
acknowledged: true— server mengonfirmasi bahwa penulisan sudah diterima sesuai write concern yang berlaku. Nilainya bisafalsebila penulisan sengaja tidak menunggu konfirmasi; kita bahas tuntas di Chapter Write Concern dan Write Results di akhir Section ini.insertedId— nilai_idyang tersimpan di server. Nilai ini sudah ada sebelum paket jaringan dikirim, karenaObjectIddibuat di sisi klien, bukan server — perilaku yang sudah kita bedah di Chapter ObjectId.
Collection Dibuat Otomatis #
Tidak ada CREATE TABLE di MongoDB. Database dan collection tercipta secara lazy — baru benar-benar terbentuk ketika document pertama ditulis. Kita bisa membuktikannya langsung:
db.getCollectionNames()Output yang Dihasilkan:
[ 'buku' ]Daftar collection di database latihan_crud kini berisi buku, padahal satu menit lalu database ini belum ada. Tidak ada langkah persiapan terpisah; insert pertama sekaligus membentuk struktur penyimpanannya. Perilaku ini berlaku berlapis: database latihan_crud baru terdaftar di show dbs setelah berisi minimal satu collection, dan collection baru terdaftar setelah berisi minimal satu document.
_id Otomatis vs Manual #
Selama field _id tidak kita isi, mongosh membuat ObjectId baru untuk setiap insert — itulah yang terlihat pada insertedId di atas. Kita juga boleh memilih _id sendiri; nilainya bisa string, angka, atau tipe BSON apa pun asalkan unik per collection:
db.buku.insertOne({
_id: "b-001",
judul: "Bumi",
penulis: "Tere Liye",
harga: 89000,
stok: 25,
kategori: "fiksi",
tag: ["fiksi", "remaja"],
rating: 4.5
})Output yang Dihasilkan:
{ acknowledged: true, insertedId: 'b-001' }Perhatikan bahwa insertedId kini berisi 'b-001' — persis nilai yang kita kirim, bukan ObjectId. Untuk melihat kedua document yang sudah tersimpan:
db.buku.find()Output yang Dihasilkan:
[
{
_id: ObjectId('6ad3854b76641838db17d002'),
judul: 'Laut Bercerita',
penulis: 'Leila S. Chudori',
harga: 98000,
stok: 12,
kategori: 'fiksi',
tag: [ 'fiksi', 'sastra' ],
rating: 4.7
},
{
_id: 'b-001',
judul: 'Bumi',
penulis: 'Tere Liye',
harga: 89000,
stok: 25,
kategori: 'fiksi',
tag: [ 'fiksi', 'remaja' ],
rating: 4.5
}
]Document pertama memakai ObjectId otomatis, document kedua memakai string 'b-001'. MongoDB tidak peduli tipe _id — yang dijaga hanyalah keunikannya per collection. Praktik umum di aplikasi: biarkan _id menjadi ObjectId untuk data operasional, dan pakai _id manual hanya untuk kunci bisnis yang stabil seperti SKU atau ISBN.
_id Duplikat Ditolak #
Uniknya _id dijaga oleh index _id_ yang otomatis ada di setiap collection, dan pelanggarannya langsung ditolak. Kita buktikan dengan memakai ObjectId tetap dua kali — nilai heksadesimal yang sama dikirim pada dua insert berbeda:
db.buku.insertOne({
_id: ObjectId("6ad3abcdef1234567890abcd"),
judul: "Filosofi Teras",
penulis: "Henry Manampiring",
harga: 89000
})
db.buku.insertOne({
_id: ObjectId("6ad3abcdef1234567890abcd"),
judul: "Filosofi Teras Edisi Revisi",
penulis: "Henry Manampiring",
harga: 95000
})Output yang Dihasilkan:
{
acknowledged: true,
insertedId: ObjectId('6ad3abcdef1234567890abcd')
}
Uncaught
MongoServerError: E11000 duplicate key error collection: latihan_crud.buku index: _id_ dup key: { _id: ObjectId('6ad3abcdef1234567890abcd') }Insert pertama berhasil; insert kedua ditolak. Pesan galatnya dibaca dari kiri: MongoServerError adalah jenisnya, E11000 adalah kode duplicate key, lalu sisanya menyebut collection (latihan_crud.buku), index yang dilanggar (_id_), dan nilai kunci yang bentrok. Penting dicatat: galat ini menghentikan statement yang bersangkutan saja — sesi mongosh tetap hidup dan perintah berikutnya tetap dieksekusi.
Sebagai penutup, bersihkan database latihan:
db.dropDatabase()Output yang Dihasilkan:
{ ok: 1, dropped: 'latihan_crud' }Rangkuman #
- Bentuk panggilan:
db.<collection>.insertOne(<document>); hasilnyaInsertOneResultberisiacknowledgeddaninsertedId. acknowledged: trueberarti server mengonfirmasi penulisan;insertedIdmemuat nilai_idyang tersimpan._iddibuat otomatis sebagaiObjectIddi sisi klien bila tidak dikirim, tetapi boleh diisi manual dengan tipe apa pun.- Database dan collection terbentuk otomatis pada penulisan pertama — tidak ada
CREATE TABLE. _idduplikat ditolak galatE11000oleh index_id_; galat tersebut menghentikan statement, bukan sesi.
Satu buku per panggilan sudah dikuasai. Chapter berikutnya mempercepat pekerjaan dengan insertMany() — menyimpan banyak document dalam satu perintah sekaligus.