Solusi Firestore Tidak Bisa Menambah Field Baru - Firebase


 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 profiles vs profile

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:

  1. Security Rules terlalu ketat

  2. Pakai .set() tanpa merge: true

  3. Document belum ada

  4. Tipe data tidak cocok

  5. Kamu salah path

  6. 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