Firestore / Javascript: возможно ли обновить старый документ и установить новый документ одновременно (одно выполнение javascript)? - PullRequest
0 голосов
/ 08 февраля 2020

То, что я пытаюсь выполнить sh - нажатием кнопки <script> выполнит 2 действия с документом. первое действие обновит старый document в этом случае document с именем 30 ноября 2019 года и изменит одно из его полей с именем isActive на false. Второе Действие установит новое document с именем на любую текущую дату, когда пользователь выполнит указанное действие.

На данный момент ни одно из указанных действий не работает. Но второе действие работает до добавления этого кода (это должен быть первый код действия, который обновляет поле старого документа) :

let userRef1 = firebase.firestore().collection("users").doc(userId).collection("goal").orderBy("dateAdded", "desc").limit(1);
                                            return userRef1.get()
                                            .then(function(querySnapshot) {
                                                querySnapshot.forEach(function(doc) {
                                                    console.log(doc.id, " => ", doc.data());
                                                    this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                            });
                                        })

                                    await firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                        'isActive': false,
                                        });

Вот полный код, который выполняет оба действия:

                                let userRef1 = firebase.firestore().collection("users").doc(userId).collection("goal").orderBy("dateAdded", "desc").limit(1);
                                        return userRef1.get()
                                        .then(function(querySnapshot) {
                                            querySnapshot.forEach(function(doc) {
                                                console.log(doc.id, " => ", doc.data());
                                                this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                        });
                                    })

                                await firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                    'isActive': false,
                                    });

                                if( getDateAndConsent.getGoalDate.getTime() >= date1.addDays().getTime() ){
                                     if(getDateAndConsent.getYN == "Yes"){
                                        await firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'startRange': startRange, 'endRange': endRange, 'dateAdded': data.dateAdded, 
                                            'isActive': data.isActive, 'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        })
                                    }
                                    else if(getDateAndConsent.getYN == "No"){
                                        await firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'dateAdded': data.dateAdded, 'isActive': data.isActive, 
                                            'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        });
                                    }
                                    else{
                                        window.alert("error");
                                    }
                                }
                                else{
                                    window.alert("error date: you can only input dates three weeks from now");
                                    window.location.href = "diabetesManagement.php"; 
                                }

Изображение базы данных: enter image description here Когда все действие будет выполнено, окруженная база данных будет обновлена. Затем будет создан новый документ с именем / id текущей даты.

1 Ответ

0 голосов
/ 11 февраля 2020

Хотя я дал ответ Дугу Стивенсону. Мне все еще трудно реализовать это. Я нашел обходной путь, хотя с помощью setTimeout() после нажатия кнопки первый запрос будет запущен. В то время как второй будет приостановлен на 3 секунды перед выполнением.

код выглядит так:

                                if( getDateAndConsent.getGoalDate.getTime() >= date1.addDays().getTime() ){
                                     if(getDateAndConsent.getYN == "Yes"){
                                        firebase.firestore().collection("users").doc(userId).collection("goal").where("isActive", "==", true)
                                        .get()
                                        .then(function(querySnapshot) {
                                            querySnapshot.forEach(function(doc) {
                                                console.log(doc.id, " => ", doc.data());
                                                this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                                firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                                    'isActive': false,
                                                })
                                            })
                                        })
                                        setTimeout(function(){firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'startRange': startRange, 'endRange': endRange, 'dateAdded': data.dateAdded, 
                                            'isActive': true, 'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        })}, 3000);
                                    }

Хотя это кажется неортодоксальным, я все же считаю это обходным путем. Надеюсь, это поможет, если вам трудно реализовать transactions или batch!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...