![](/img/trans.png)
[英]Google firestore rest API: How to create documents within a transaction
[英]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.