Как обновить данные документа Firebase по клику в проекте vuetify - PullRequest
0 голосов
/ 10 апреля 2019

Я недавно выполнил учебник по vuetify в Net Ninja на youtube и создал список задач. Теперь я хочу иметь возможность щелкнуть по кнопке «пометить как завершенную» в задаче, чтобы получить доступ к моей коллекции Firebase (называемой «проекты») и обновить соответствующее поле документа (статус) значением «завершено». Мне удалось использовать query.get () и отобразить правильные данные документа в моей консоли, но я не знаю, как я могу обновить документ на этом этапе.

Эта кнопка является частью цикла v-for, который выводит мой контент:

<v-btn v-if="project.status !== 'complete'" @click="updateData(project.title)" class="success ml-0">Mark as complete <v-icon right>check</v-icon></v-btn>

Я могу использовать этот метод, чтобы получить данные из правильного документа и войти в консоль:

updateData(projectTitle){
    db.collection("projects").where("title", "==", projectTitle)
    .get()
      .then(function(querySnapshot){
        querySnapshot.forEach(function(doc){
          console.log(doc.id, " = >", doc.data());
        });
      })  
  }

Я просто не уверен, как на самом деле обновить документ отсюда. Я смог использовать эту строку для обновления документа, включив в себя действительно длинный документ под кодовым названием ...

db.collection('projects').doc('tjwnZZHGDkZWJxpXMdHj').update({
  status: 'complete'
})

Но есть ли способ немного изменить эту строку и вставить ее в функцию querySnapshot? Если нет, как я могу обновить выбранный документ в функции querySnapshot?

1 Ответ

1 голос
/ 11 апреля 2019

Ваш querySnapshot включает DocumentSnaphots.Из них вы можете получить DocumentReference, и на нем вы звоните .update()


Результат должен выглядеть следующим образом:

updateData(projectTitle){
    db.collection("projects").where("title", "==", projectTitle)
    .get()
      .then(function(querySnapshot){
        querySnapshot.forEach(function(doc){
          doc.ref.update({status: 'complete'});
        });
      })  
  }

Это должно работать, тогда я бы рассмотрел использование batch запросов.(Также я обновил до async/await).Максимум batch составляет 500 операций.Чек https://firebase.google.com/docs/firestore/manage-data/transactions

async updateData(projectTitle){
    var batch = db.batch();
    var querySnapshot = await db.collection("projects")
                                .where("title", "==", projectTitle)
                                .get();
    querySnapshot.forEach(function(doc){
          batch.update(doc.ref, { status: 'complete'});
    });
    batch.commit();
  }

...