Saat ini saya mencoba Firestore, dan saya terjebak pada sesuatu yang sangat sederhana: "mengupdate array (alias sub dokumen)".
Struktur DB saya sangat sederhana. Sebagai contoh:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
Saya mencoba (tidak berhasil) untuk memasukkan record baru ke dalam shareWith
array objek.
Saya sudah mencoba:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "[email protected]", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "[email protected]", when: new Date() }] })
Tidak ada yang berhasil. Kueri ini menimpa array saya.
Jawabannya mungkin sederhana, tetapi saya tidak dapat menemukannya ...
sumber
arrayUnion
metode ini.Firestore sekarang memiliki dua fungsi yang memungkinkan Anda memperbarui array tanpa menulis ulang semuanya.
Tautan: https://firebase.google.com/docs/firestore/manage-data/add-data , khususnya https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
sumber
Anda dapat menggunakan transaksi ( https://firebase.google.com/docs/firestore/manage-data/transactions ) untuk mendapatkan larik, mendorongnya, lalu memperbarui dokumen:
sumber
documentReference
adduserRef
seperti yang ditunjukkan:transaction.set(userRef, { bookings: [booking] });
Berikut adalah contoh terbaru dari dokumentasi Firestore:
firebase.firestore.FieldValue. ArrayUnion
sumber
Maaf Terlambat ke pesta tetapi Firestore menyelesaikannya kembali pada Agustus 2018 jadi Jika Anda masih mencari itu di sini, semua masalah diselesaikan berkaitan dengan array.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Entri blog resmi
array-contains, arrayRemove, arrayUnion untuk memeriksa, menghapus dan memperbarui array. Semoga membantu.
sumber
Untuk membangun jawaban Sam Stern , ada juga opsi ketiga yang membuat segalanya lebih mudah bagi saya dan itu menggunakan apa yang disebut Google sebagai Peta, yang pada dasarnya adalah kamus.
Menurut saya kamus jauh lebih baik untuk kasus penggunaan yang Anda gambarkan. Saya biasanya menggunakan array untuk hal-hal yang tidak terlalu banyak diperbarui, jadi mereka kurang lebih statis. Tetapi untuk hal-hal yang banyak ditulis, khususnya nilai yang perlu diperbarui untuk bidang yang ditautkan ke sesuatu yang lain dalam database, kamus terbukti jauh lebih mudah untuk dipelihara dan dikerjakan.
Jadi untuk kasus spesifik Anda, struktur DB akan terlihat seperti ini:
Ini akan memungkinkan Anda untuk melakukan hal berikut:
Alasan untuk mendefinisikan objek sebagai variabel adalah bahwa menggunakan
'sharedWith.' + whoEmail + '.when'
langsung dalam metode set akan menghasilkan kesalahan, setidaknya saat menggunakannya dalam fungsi cloud Node.js.sumber
Selain jawaban yang disebutkan di atas. Ini akan berhasil. Menggunakan Angular 5 dan AngularFire2. atau gunakan firebase.firestore () sebagai ganti this.afs
sumber
Pertimbangkan John Doe sebagai dokumen daripada sebuah koleksi
Berikan koleksi hal dan halSharedWithOthers
Kemudian Anda dapat memetakan dan menanyakan hal-hal yang dibagikan John Doe dalam koleksi thingsSharedWithOthers paralel itu.
sumber
Jika ada yang mencari solusi sdk Java firestore untuk menambahkan item dalam bidang array:
Untuk menghapus item dari pengguna array:
FieldValue.arrayRemove()
sumber
sumber