Pernah nggak kamu lagi santai ngoding, minum kopi, tiba-tiba muncul error dari Firestore yang bunyinya kira-kira begini:
"Error: FAILED_PRECONDITION: The field does not exist"
atau
"Missing or insufficient permissions"
Dan kamu langsung bengong sambil berkata dalam hati,
“Lho Firestore, aku cuma mau nambah field doang, kenapa sih kamu gitu banget?”
Tenang, kamu nggak sendirian.
Banyak developer dari yang baru belajar Firebase sampai yang sudah hatam React, Flutter, atau Next.js sering banget ketemu masalah Firestore tidak bisa menambah field baru, padahal harusnya simpel banget tinggal:
await FirebaseFirestore.instance
.collection('products')
.doc(productId)
.update({'stock': 100});
Eh Firestore malah ngeyel.
Nah, artikel ini dibuat khusus untuk membahas semua penyebab dan solusi kenapa Firestore suka menolak penambahan field baru.
Bahasanya santai, lucu dikit, tapi tetap serius biar kamu nggak tersesat di hutan Firebase.
Kita akan bahas dari yang paling umum sampai yang paling “ajaib”.
Penyebab Utama Firestore Tidak Bisa Menambah Field Baru
Sebelum masuk solusi, kita pelajari dulu “sifat asli” Firestore yang bikin dia menolak field baru.
Ini penyebab yang paling sering terjadi:
Security Rules Menghalangi Kamu (Inilah Tersangka Nomor 1)
Banyak developer lupa bahwa Firestore bukan sekadar database biasa.
Ia punya Security Rules yang sangat ketat. Ketatnya itu level seperti satpam ruko yang baru dapat bonus.
Kalau rules kamu seperti ini:
// SALAH BESAR UNTUK UPDATE FIELD BARU
allow update: if request.resource.data.keys().hasOnly(resource.data.keys());
Artinya server hanya mengizinkan update jika field yang di-update sudah ada sebelumnya.
Jadi kalau kamu ingin menambah field baru, ya jelas ditolak.
Atau rules seperti:
allow update: if request.resource.data.size() == resource.data.size();
Ini artinya jumlah field tidak boleh berubah. Lagi-lagi field baru dianggap kriminal.
Atau yang lebih klasik:
allow write: if false;
Ya jelas aja nggak bisa nambah field…
Kamu Pakai .set() Tanpa merge: true
Kesalahan pemula + developer senior yang ngantuk:
kamu meng-update dokumen pakai .set() tapi lupa pakai merge.
Misalnya:
db.collection("users").doc("uid123").set({
age: 24
});
Ini menghapus seluruh field lama dan hanya menyisakan age.
Kalau kamu ingin menambah field baru tanpa menghapus field lama, wajib pakai:
.set({ age: 24 }, { merge: true });Document Belum Ada
Kadang developer merasa dokumen itu ada.
Firestore bilang tidak ada.
Siapa yang benar?
Ya jelas Firestore.
Kalau document belum pernah dibuat, lalu kamu memanggil .update(), maka error akan muncul:
“No document to update”
Bentuk Data Tidak Cocok
Terkadang kamu ingin menambah field baru, tapi Firestore menolak karena bentuk datanya “salah”.
Misalnya kamu ingin menambah field array, tapi malah mengirimkan object atau sebaliknya.
Contoh:
Kamu ingin menambah field:
tags: ['tech', 'mobile']
Tapi kamu kirim:
tags: 'tech'
Firestore langsung bilang:
“Ini bukan array, bro…”
Kamu Salah Path (Ini Sering Banget Terjadi)
Kadang Firestore tidak salah, tapi kamu yang salah alamat.
Misalnya kamu yakin path kamu:
users → uid123 → profile
Tapi ternyata kamu menulis:
users → uid123 → profiles
S satu itu bikin developer insecure.
Solusi Lengkap Untuk Mengatasi Firestore Tidak Bisa Menambah Field Baru
Sekarang mari kita bahas solusi dari tiap penyebab tadi, dengan urutan yang paling efektif.
Periksa Security Rules (Solusi Paling Penting)
Sering kali masalahnya cuma rules yang terlalu ketat.
Gunakan rules yang fleksibel tapi tetap aman, misalnya:
allow update, create: if request.auth != null;
Atau kalau ingin lebih aman:
allow update: if request.auth != null
&& request.resource.data.keys().hasAll(resource.data.keys());
Kalau kamu ingin bebas menambah field baru:
allow update: if request.auth != null;
Kalau sedang development, boleh sementara pakai:
allow read, write: if true;
TAPI JANGAN PRODUKSI YA!
Bisa jebol satu negara datanya.
Gunakan .set() dengan merge: true
Cara yang paling aman dan recommended:
JavaScript / TypeScript
db.collection("users").doc("uid123").set({
address: "Jakarta"
}, { merge: true });
Flutter / Dart
await FirebaseFirestore.instance
.collection("users")
.doc("uid123")
.set({'address': 'Jakarta'}, SetOptions(merge: true));
Kapan pakai merge?
Saat ingin menambah field tanpa menghapus field lama
Saat ingin update sebagian data saja
Saat ingin menambahkan nested field
Pastikan Document Sudah Ada Sebelum Update
Kalau kamu pakai .update(), dokumen harus ada dulu.
Solusinya, buat dulu jika belum ada:
final doc = FirebaseFirestore.instance.collection('users').doc('uid123');
// Cek apakah ada
if (!(await doc.get()).exists) {
await doc.set({});
}
await doc.update({'premium': true});
Atau lebih simpel:
Gunakan .set(…, merge: true) saja.
Pastikan Tipe Data Sesuai
Beberapa contoh:
Untuk array
Benar:
update({ tags: ["mobile", "tech"] })
Salah:
update({ tags: "mobile" })
Untuk timestamp
Benar:
update({ createdAt: firebase.firestore.FieldValue.serverTimestamp() });Pastikan Path Tidak Salah
Periksa:
-
nama koleksi
-
nama dokumen
-
nama subcollection
-
huruf kecil / besar
-
typo seperti
profilesvsprofile
Saran pro:
Selalu buat fungsi terpusat untuk path Firestore supaya tidak typo.
Tips Agar Masalah Ini Tidak Terulang
Berikut beberapa tips dari pengalaman developer Firebase senior.
Pakai Firestore Emulator
Dengan emulator, kamu bisa debugging:
-
rules
-
path
-
request
-
response
-
error detail
Tanpa takut data real hilang.
Tambahkan Logging
Contoh:
console.log("Updating user:", userId, dataToUpdate);
Kadang error muncul karena data yang dikirim berbeda dengan ekspektasi kamu.
Selalu Validasi Data Sebelum Update
Gunakan schema builder seperti:
-
Typesaurus
-
FirelordJS
-
Zod + Firestore
Biar data tidak salah tipe.
Gunakan Cloud Functions Untuk Validasi Berat
Kalau aplikasi kamu besar atau sensitif, buat layer backend untuk:
-
validasi struktur data
-
validasi role
mencegah data berbahaya
Contoh Kasus Paling Umum + Solusinya
Mari kita lihat contoh nyata yang sering dialami developer.
Kasus 1: Firestore Menolak Update Karena Rules Terlalu Ketat
Rules:
allow update: if request.resource.data.keys().hasOnly(resource.data.keys());
Solusi:
allow update: if request.auth != null; Kasus 2: Tidak Bisa Menambah Field Baru di Flutter
Kode salah:
await FirebaseFirestore.instance
.collection('products')
.doc(id)
.set({'stock': 10});
Solusi:
.set({'stock': 10}, SetOptions(merge: true)); Kasus 3: Field Baru Tidak Muncul Karena Path Salah
Misal kamu tulis:
users -> uid123 -> personal
Padahal kamu simpan di:
users -> uid123 -> profiles
Solusi:
Periksa path melalui Firebase Console atau emulator.
Kasus 4: Document Tidak Ada Tapi Kamu Pakai Update
Solusi:
Gunakan:
.set(…, merge: true) Kesimpulan: Menambah Field Baru di Firestore Itu Mudah, Asal Tahu "Sifat"-nya
Setelah lebih dari 1000 kata kita bahas, intinya adalah:
Firestore tidak bisa menambah field baru biasanya disebabkan oleh:
-
Security Rules terlalu ketat
-
Pakai
.set()tanpamerge: true -
Document belum ada
-
Tipe data tidak cocok
-
Kamu salah path
-
Query update tidak sesuai format
Solusinya:
-
Perbaiki rules
-
Pakai merge
-
Pastikan dokumen ada
-
Pastikan tipe data sesuai
-
Perbaiki path
-
Gunakan emulator untuk debugging
Firestore itu bukan database galak, dia cuma mengikuti aturan yang kita tulis sendiri.
Kalau kita ngerti perilakunya, semuanya jadi gampang.

0 Comments:
Posting Komentar