#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
, имея это в руках, вы можете выполнить любое действие над документом!