Firestore云函数以参数更新集合中所有文档中的字段。
Firestore云函数以参数更新集合中所有文档中的字段。
我有一个名为"Messages
"的Firestore集合,其中包含一个布尔字段"viewed
"和一个包含coll:Users
引用的字段"userToRef
"。我希望我的云函数能够将"userToRef
"字段中与URL参数"userRef
"相同的用户引用的所有文档中的"viewed
"字段更新为"True
"。
但无论我做什么,都会引发404错误
:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.allMsgOfUserRead = functions.https.onRequest((req, res) => { // 从请求中获取文档的用户引用 const strRef = req.query.userRef; const userRef = admin.firestore().collection('Users').doc(strRef); // 更新"Messages"集合中所有文档的"viewed"字段, // 其中"userToRef"字段与用户引用匹配 return admin.firestore() .collection('Messages') .where('userToRef', '==', userRef) .get() .then(snapshot => { if (!snapshot.exists) { // 文档不存在,返回错误响应 return res.status(404).json({ message: `未找到发送给用户的消息 ${req.query.userRef}`, code: 404 }); } snapshot.forEach(doc => { doc.ref.update({ viewed: true }); }); return res.json({ message: '成功', code: 200 }); }) .catch(error => { return res.status(500).json({ message: '发生错误', code: 500 }); }); });
我真的需要一个理由,为什么会发生这种情况...谢谢!
问题的原因是在forEach循环中执行了一组异步update()方法的调用,应该使用Promise.all()来处理。此外,还需要注意QuerySnapshot始终存在并且可能为空,可以使用empty属性进行检查。
解决方法是使用async/await关键字来简化和清理代码。在代码中添加了一个if块,使用async/await可以使代码更加简单。
最后的备注是QuerySnapshot很可能只包含0个或1个QueryDocumentSnapshot,所以不需要循环。如果QuerySnapshot不为空,可以使用snapshot.docs[0]来获取唯一的文档。
文章内容如下:
在Firestore云函数中更新集合中所有文档的字段
在Firestore云函数中,我们经常需要对集合中的所有文档进行批量更新。下面是一个示例的云函数代码,用于更新Messages集合中与给定用户相关的所有消息文档的viewed字段为true。
exports.allMsgOfUserRead = functions.https.onRequest(async (req, res) => { try { // 从请求中获取用户引用的id const strRef = req.query.userRef; const userRef = admin.firestore().collection('Users').doc(strRef); // 更新Messages集合中所有userToRef字段与用户引用匹配的文档的viewed字段为true const snapshot = await admin.firestore() .collection('Messages') .where('userToRef', '==', userRef) .get(); if (snapshot.size === 0) { // 文档不存在,返回错误响应 res.status(404).json({ message: `Messages to User not found ${req.query.userRef}`, code: 404 }); } else { const promises = []; snapshot.forEach(doc => { promises.push(doc.ref.update({ viewed: true })); }); await Promise.all(promises); res.json({ message: 'Success', code: 200 }); } } catch (error) { res.status(500).json({ message: 'Error occurred', code: 500 }); } });
此外,我们还可以通过使用async/await关键字来简化和清理代码。在上述代码中,我们使用了async/await来处理异步操作,使代码更加简单。
另外需要注意的是,QuerySnapshot很可能只包含0个或1个QueryDocumentSnapshot,所以不需要使用循环。如果QuerySnapshot不为空,我们可以使用snapshot.docs[0]来获取唯一的文档。
以上就是在Firestore云函数中更新集合中所有文档的字段的原因和解决方法。希望对你有所帮助!
问题的原因是使用admin.firestore().collection('Users').doc(strRef)
作为搜索代码.where('userToRef', '==', userRef)
中的键时,可能无法获得预期的结果。解决方法是使用req.query.userRef
作为键来替代。
实际上,你可以使用DocumentReference
来查询一个集合。参考stackoverflow.com/a/53141199/3371862。