簡體   English   中英

如何在事務中創建新的 Firestore 文檔

[英]How do you create a new Firestore document within a transaction

我正在嘗試記錄對客戶記錄集合的更改。 為了保持萬無一失,日志記錄顯然應該在 Firestore 事務中創建。 我使用transaction.set應用客戶文檔更改沒有問題,但每個此類更改都需要在我的transactionLogs集合中創建一個新文檔。 在這里,事情變得嚴重錯誤日志文檔由時間戳字段標識,當我運行以下代碼時:...

import { initializeApp } from 'firebase/app';
import {
    getFirestore, collection, query, getDoc,
    getDocs, where, orderBy, addDoc, doc, updateDoc, deleteDoc, runTransaction
} from 'firebase/firestore';

var firebaseApp = initializeApp(firebaseConfig);
var db = getFirestore(firebaseApp);

// code to read and validate update to customer documents and to call the following asynch function

function performCustomerUpdate(parameters) {

await runTransaction(db, async (transaction) => {

 // update Customer document and build a transactionLog object

 const newLogRef = collection(db, 'transactionLogs', transactionLog.timeStamp);
 await transaction.set(newLogRef, transactionLog);

});
}

... transaction.set指令無法顯示類似"Invalid collection reference. Collection references must have an odd number of segments, but transactionsLogs/1645451217221 has 2." 在此特定實例中,1645451217221 將是 transactionLog.timesStamp 的值。

有沒有人對這里發生的事情以及如何修復錯誤有建議? 我的理解是,如果提供的引用不存在, transaction.set將創建一個新記錄,所以我應該在正確的行上。 但是為什么 Firestore 認為我想在一個名為 transactionsLogs/1645451217221 的集合中創建它? 如何獲取它,為名為“transactionsLogs”的集合中由字符串“1645451217221”標識的文檔創建引用?

如果您指定文檔 ID(而不是使用自動生成的 ID),則必須使用doc()而不是collection()來創建DocumentReference

const newLogRef = doc(db, 'transactionLogs', transactionLog.timeStamp);

collection() function 用於創建CollectionReference

另請查看: Firestore:在 Web v9 中添加新數據的模式是什么?


我的理解是,如果提供的引用不存在, transaction.set將創建一個新記錄

如果文件存在,它將覆蓋現有文件。

關於如何在事務中添加記錄這一更廣泛的問題,答案是您將使用與在事務使用的代碼幾乎相同的代碼。

因此,在事務之外,您將使用以下 Web 版本 9 代碼創建一個新文檔,其中包含一個數據項作為其標識符:

        const myDocRef = doc(db, "myCollection", myDocId);
        await setDoc(myDocRef, myDocData);

在 transaction 內部,您使用完全相同的模式,唯一的例外是setDoc()transaction.set()替換,並且整個操作(顯然)被runTransaction(db, async (transaction) => {指令包圍:

    await runTransaction(db, async (transaction) => {

        const myDocRef = doc(db, "myCollection", myDocId);
        await transaction.set(myDocRef, myDocData);

    }).catch((error) => {
        alert(`Oops - transaction failed - error is : ${error}`);
    });

同樣,用於創建具有自動生成的id 的文檔的模式:

        const myCollectionRef = collection(db, "myCollection");
        const myDocRef = doc(myCollectionRef)
        await setDoc(myDocRef, myDocData);

在事務中被替換為

        const myCollectionRef = collection(db, "myCollection");
        const myDocRef = doc(myCollectionRef)
        await transaction.set(myDocRef, myDocData);

請注意,如果您發現需要查找分配給自動生成的 ID 的值,可以使用myDocRef.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM