Firestore - 在一个事务中进行多个添加和更新操作

时间:2018-06-16 11:37:31

标签: firebase transactions google-cloud-firestore google-cloud-functions

我有一个Firestore文档,表示一个日期,其中包含一个子集合,其中包含Firestore数据库中当天的预订。

以下是我的数据结构的JSON示例:

{  
   "Day":{  
      "ReservationsCount":2,
      "Reservations":[  
         {  
            "Order":1
         },
         {  
            "Order":2
         }
      ]
   }
}

我需要添加一组文档,在集合中设置它们的序号,并在一个事务中更新ReservationsCount。

我尝试使用firestore事务和批量写入,但据我所知,他们不支持在事务中将文档添加到集合中(根据documentation仅组合set(),update()或delete()操作)。

我尝试使用云功能更新值,但是它们处于测试阶段并且有known issues with performance and reliability,因此我有时会得到错误的结果。

有没有办法更新现有文档并在一个事务中将文档添加到其子集合中?

1 个答案:

答案 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>