我有一个Firestore文档,表示一个日期,其中包含一个子集合,其中包含Firestore数据库中当天的预订。
以下是我的数据结构的JSON示例:
{
"Day":{
"ReservationsCount":2,
"Reservations":[
{
"Order":1
},
{
"Order":2
}
]
}
}
我需要添加一组文档,在集合中设置它们的序号,并在一个事务中更新ReservationsCount。
我尝试使用firestore事务和批量写入,但据我所知,他们不支持在事务中将文档添加到集合中(根据documentation仅组合set(),update()或delete()操作)。
我尝试使用云功能更新值,但是它们处于测试阶段并且有known issues with performance and reliability,因此我有时会得到错误的结果。
有没有办法更新现有文档并在一个事务中将文档添加到其子集合中?
答案 0 :(得分:3)
以下应该可以解决问题。您必须将updateRes()
函数传递给'日" doc,子集合的引用和包含要添加到子集合的每个文档的对象的数组。
只需在浏览器中打开HTML文件即可。
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-firestore.js"></script>
</head>
<body>
<script>
var config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
....
};
firebase.initializeApp(config);
var firestoredb = firebase.firestore();
function updateRes(dayDocRef, orderCollectionRef, refAndDataArray) {
return firestoredb.runTransaction(function (transaction) {
return transaction.get(dayDocRef)
.then(function (dayDoc) {
if (!dayDoc.exists) {
throw "Document Day does not exist!";
}
newResCount = dayDoc.data().ReservationsCount + refAndDataArray.length;
return transaction.update(dayDocRef, { ReservationsCount: newResCount });
})
.then(function () {
var t = transaction;
refAndDataArray.forEach(function (element) {
t = t.set(orderCollectionRef.doc(element.ref), element.data);
});
return t;
});
}).then(function () {
console.log("Transaction successfully committed!");
}).catch(function (error) {
console.log("Transaction failed: ", error);
});
};
var dayDocRef = firestoredb.collection("Days").doc("Day");
var orderCollectionRef = dayDocRef.collection("Reservations"); //The sub-collection is called "Reservations"
var refAndDataArray = [{ ref: "3", data: { Order: 3, otherData: "foo" } }, { ref: "4", data: { Order: 4, otherData: "bar" } }];
updateRes(dayDocRef, orderCollectionRef, refAndDataArray);
</script>
</body>
</html>