云函数从Firestore路径获取列表。

10 浏览
0 Comments

云函数从Firestore路径获取列表。

我在我的Firestore中有这个架构:test1/{test1ID}/test2/

每当新数据添加到test1ID时,我希望在云函数中与我的Firestore进行交互。

我的目标是在数据更新时更新test1ID文档,更新其子集test2下的第[0]个 + 第[1]个 + 第[2]个文档的值。

但是使用下面的代码,我得到了test2文档列表(currentTest2DocumentList)未定义的错误。

(错误信息 => TypeError: Cannot read property '0' of undefined)

我该如何获取子集下的有效文档列表?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.onItemDocumentUpdate = functions.firestore.document('test1/{test1ID}')
.onUpdate(async (change, context) => {
const currentTest1ID = context.params.test1ID
const currentTest2DocumentList = await 
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(function(docs) {return docs.forEach(function (doc){doc.data()})})
const addedValue = currentTest2DocumentList[0].field1 + currentTest2DocumentList[1].field1 + 
currentTest2DocumentList[2].field1
return admin.firestore().collection('test1').doc(currentTest1ID).update({testField: 
addedValue});

0
0 Comments

问题出现的原因是代码中的context.params.ID并不返回预期的结果,currentTest1ID的值是undefined。这是因为context.params只包含在文档路径中由通配符标记的键。在文档路径中没有名为"ID"的通配符。也许你想要的是这样的:

const currentTest1ID = context.params.test1ID

。注意,test1ID与你在函数路径中定义的通配符匹配。

感谢你的更正。我已经编辑了问题。在问题被纠正之后,'currentTest2DocumentList'仍然未定义。对此有什么建议吗?

解决方法:

检查currentTest2DocumentList的定义和使用。确保它被正确地声明和初始化。还要确保它在使用之前已经被赋值。如果currentTest2DocumentList仍然未定义,可以尝试使用调试工具来跟踪代码执行过程,以找出问题所在。

0
0 Comments

Cloud Functions从Firestore路径获取列表的问题出现的原因是forEach函数没有返回任何值。尝试访问集合快照的docs字段,并使用JavaScript的map函数进行处理。

在给定的代码示例中,首先导入所需的函数和模块。然后初始化Firebase Admin,并设置一个监听函数,该函数在'test1/{test1ID}'路径下的文档更新时触发。

在监听函数中,首先获取当前文档的test1ID参数。然后使用admin.firestore()方法读取'test1/{test1ID}/test2'路径下的集合数据。通过使用async/await和Promise的方式,我们可以获取到一个包含文档数据的集合快照。

接下来,使用map函数对集合快照中的每个文档进行处理,将其数据作为数组返回。然后使用reduce方法计算数组中field1字段的总和。

最后,使用update方法将计算得到的总和值更新到'test1'集合中的对应文档的testField字段。

此外,还建议使用增量和减量的解决方案来减少文档读取次数,以降低使用Cloud Firestore产生的费用。

整体而言,通过使用正确的函数和方法,我们可以从Firestore路径获取到所需的列表,并进行相应的处理和更新操作。

0
0 Comments

问题的原因是在使用forEach函数时出现了错误。解决方法是使用正确的语法来遍历文档,并将其数据保存到一个数组中。另外,如果在test2集合中的文档数量超过3个,那么读取所有文档可能是一种浪费。可以通过添加limit(3)来限制读取的文档数量。

以下是解决方法的完整文章:

Cloud Functions中从Firestore路径获取列表的问题及解决方法

在使用Cloud Functions的过程中,有时需要从Firestore的特定路径获取文档列表。然而,在实现这个功能时可能会遇到一些问题。本文将介绍一个常见的问题以及解决方法。

问题的表现是在使用forEach函数时出现了错误。下面是一个示例代码:

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(function(docs) {
  let res = []
  docs.forEach(doc => res.push(doc.data()));
  return res;
})

在这个代码中,我们尝试使用forEach函数遍历获取到的文档列表。然而,由于使用了错误的语法,导致出现了错误。为了解决这个问题,我们可以使用正确的语法来遍历文档,并将其数据保存到一个数组中。下面是修复后的代码:

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(docs => docs.map(doc => doc.data()));

通过使用map函数,我们可以更加简洁地遍历文档,并将其数据保存到一个数组中。这样就解决了使用forEach函数时出现的问题。

除了修复forEach函数的使用错误外,还可以进一步优化代码。如果在test2集合中的文档数量超过3个,那么读取所有文档可能是一种浪费。为了解决这个问题,我们可以使用limit(3)来限制读取的文档数量。下面是添加了limit的修复后的代码:

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').limit(3).get()
.then(docs => docs.map(doc => doc.data()));

通过添加limit(3),我们可以确保最多只读取3个文档,从而提高代码的效率。

在Cloud Functions中从Firestore路径获取列表时,可能会遇到使用forEach函数错误的问题。为了解决这个问题,我们可以使用正确的语法来遍历文档,并将其数据保存到一个数组中。另外,如果在读取文档时需要限制数量,可以使用limit函数来限制读取的文档数量。通过这些修复,我们可以顺利地从Firestore路径获取到所需的文档列表。

0