我正在尝试运行需要从查询中获取数据的事务:
firestore
.runTransaction((transaction) => {
const query = firestore
.collection("Lottories")
.doc("R3DYubrqFbbVfQNjYXfh")
.collection("sets")
.where("isAvailable", "==", false)
.limit(1);
return transaction.get(query).then((snapshot) => {
const ticketDoc = snapshot.docs[0];
const ticketDocData = ticketDoc.data();
const lottoUpdate = firestore
.collection("Lottories")
.doc("R3DYubrqFbbVfQNjYXfh")
.collection("sets")
.doc(ticketDoc.id);
const ticketUpdate = firestore
.collection("UserLotto")
.doc(userId)
.collection("tickets")
.doc("abc");
const countUpdate = firestore
.collection("UserData")
.doc(userId);
transaction.update(lottoUpdate, { isAvailable: true });
transaction.update(countUpdate, {
ticketCount: ticketCount - 2,
});
transaction.set(ticketUpdate, {
ticketId: ticketDoc.id,
lottoId: "abc",
claimed: false,
});
return ticketDocData;
});
})
.then((ticketDocData) => {
console.log(
"Transaction successfully committed!",
ticketDocData
);
setPopScreen("ticketPurchased");
})
.catch((error) => {
console.log("Transaction failed:", error);
});
对于我的应用程序,我需要运行一个查询,以完成我的事务。我得到的错误:
交易失败:[Firebase错误:函数Transaction.get()要求它的第一个参数是DocumentReference,但它是:自定义测试对象]
我知道事务处理需要文档参考。是否有解决方法?
2条答案
按热度按时间zf9nrax11#
最接近的等效方法是使用更高的限制进行查询,然后在事务中再次获取文档并再次检查所需的输入条件......
事务
get
的第一个参数实际上是一个文档引用,而不是查询。这是令人困惑的,因为documentReference.get()
、transaction.get(documentReference)
和query.get()
看起来和听起来都差不多,但事务只是单个文档上的原子,而不是查询中的集合上的原子,即使是限制为1的集合。ibrsph3r2#
transaction.get(query)
query
必须是一个文档引用。因此,您需要类似以下的内容: