Saya memiliki dokumen firestore yang ingin saya perbarui. Ini kode saya -

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                name: userName,
                email: email,
            },
            { merge: true },
        );

Saya menggunakan metode "SET" dengan objek "gabungan: true". Karena saya ingin membuat dokumen baru jika tidak ada dan perbarui data jika ada.

Dokumen yang saya coba perbarui adalah ditulis ulang oleh properti baru yang saya kirim, daripada menambahkan data dalam dokumen yang ada. Saya membaca itu menggunakan {merge: true} akan menggabungkan data yang masuk dengan data saat ini, tetapi itu tidak berfungsi. Seluruh dokumen saya digantikan oleh data baru.

Inilah koleksi firestore saya ketika saya pertama kali membuat dokumen -

enter image description here

Dan inilah dokumen yang sama ketika saya memperbaruinya -

enter image description here

0
user3399180 4 April 2021, 19:16

2 jawaban

Saya mendapatkannya bekerja dengan melakukan apa yang disarankan Frank Van Puffelen. Inilah kode yang benar jika ada yang membutuhkan ini di masa depan -

admin
    .firestore()
    .collection('testResult')
    .doc(`${testId}`)
    .get()
    .then(doc => {
        if (doc.exists) {
            admin
                .firestore()
                .collection('testResult')
                .doc(`${testId}`)
                .update({
                    data: admin.firestore.FieldValue.arrayUnion(
                        { userName, email }
                    ),
                });
        } else {
            admin
                .firestore()
                .collection('testResult')
                .doc(`${testId}`)
                .set({
                    data: [{ userName, email }],
                });
            }
        return;
    })
    .catch(error => console.log(error));

Pertama saya memeriksa apakah dokumen itu ada. Jika tidak ada maka saya membuat dokumen baru dan menyimpan objek yang berisi array dengan nilai-nilai saya. Jika ada maka saya memperbarui array.

0
user3399180 5 April 2021, 08:40

merge tidak membuat bidang baru , itu memungkinkan Anda untuk menambahkan bidang baru yang belum ada atau untuk memperbarui bidang tertentu secara selektif. Nama Field unik; Dalam pernyataan Anda:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                name: userName,
                email: email,
            },
            { merge: true },
        );

Anda menentukan bidang name dan email, dan persis seperti perintah mengatakan itu adalah menetapkan bidang-bidang tersebut ke nilai-nilai baru. Jika Anda selesai:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                anotherName: userName,
                anotherEmail: email,
            },
            { merge: true },
        );

... itu akan menambahkan bidang-bidang itu (seperti pada "menggabungkan bidang baru ke dalam dokumen") dan meninggalkan bidang yang ada name dan email di tempatnya

jika yang telah Anda lakukan:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                anotherName: userName,
                anotherEmail: email,
            },
            { merge: false },
        );

... (Catatan Gabung: Salah) itu akan mengatur dokumen ke

            {
                anotherName: userName,
                anotherEmail: email,
            },

... mengabaikan bidang yang ada.

Ingat, FieldNames unik dalam sebuah dokumen - Anda tidak akan melihat dokumen seperti:

            {
                name: userName1,
                email: email1,
                name: userName2,
                email: email2,
                name: userName3,
                email: email3,
                name: userName4,
                email: email4,
            }

Saya sangat menyarankan Anda mempelajari dokumentasi sedikit lebih dan memahami persis bagaimana dokumen firestore bekerja .

0
LeadDreamer 4 April 2021, 18:19