Firestore обновляет документ после запроса

#firebase #google-cloud-firestore #google-cloud-functions

#огневая база #google-облако-firestore #google-cloud-функции

Вопрос:

Я хочу вставить объект в существующий документ (последний документ коллекции).

Я выполняю запрос, и если документ не заполнен, я вставляю новый объект в массив (обновляя документ).

 admin.firestore().collection('LinkPages').orderBy("sequence", "desc").limit(1).get()
   .then(function (linkPagesRef) { 
      linkPagesRef.forEach(function(doc) {
         const linkDocument = doc.data();
            const sequence = doc.data().sequence;
            if(linkDocument.links.length > 19)
            {
               functions.logger.info("Document full. Need to create one more");
            }
            else
            {
               functions.logger.info("Document not full. reuse it : ", linkDocument);
               doc.update({ links: admin.firestore.FieldValue.arrayUnion(youtubeData)})
               .then(function (docRef) { response.status(200).send("Ok"); })
               .catch(function (error) { functions.logger.info("Error adding document: ", error); response.status(500).send("Internal error"); });
            }
      });
    })
   .catch(function (error) { functions.logger.info("Error getting LinksPages document: ", error); response.status(500).send("Internal error"); });
 

Но при выполнении у меня возникает ошибка :

 {"severity":"INFO","message":"Error getting LinksPages document:  TypeError: doc.update is not a functionn
 

Похоже, что API firestore на самом деле не является последовательным, и в зависимости от того, как вы получаете ссылку на документы, у вас нет одинаковых доступных функций.

Комментарии:

1. Я бы рекомендовал использовать документацию библиотеки , чтобы проверить, какие методы предоставляются каждым типом / интерфейсом.

Ответ №1:

Вы должны вызвать функцию обновления на DocumentReference ;

вместо этого

 doc.update({ links: admin.firestore.FieldValue.arrayUnion(youtubeData)})
 

используйте

 doc.ref.update({ links: admin.firestore.FieldValue.arrayUnion(youtubeData)})
 

ref поле дает вам DocumentReference , имея это в руках, вы можете выполнить любое действие над документом!