我需要创建一个函数,在执行后,它需要更改我的整个用户集合中的一个元素,该元素将从每个用户更改一个特定的属性,即deviceToken
exports.changeDeviceToken = functions.https.onRequest(async (req, res) => {
var db = admin.firestore();
let snap = await db.collection('user').get()
snap.forEach(async(doc) => {
return await doc.data().update({
deviceToken: ""
})
});
res.status(200).send('Finished')
});
此函数不会在每个用户属性中更新我的deviceToken
属性,我需要将deviceToken属性中的内容替换为空的"">
它说更新不是的功能
试试这个:
const db = admin.firestore();
const getAllDocs = function(data) {
const temp = []
data.forEach(function (doc) {
temp.push(doc.data())
})
return { data: temp }
}
exports.changeDeviceToken = functions.https.onRequest(async (req, res) => {
let { data: snaps } = await db.collection('user').get().then(getAllDocs)
for (const snap of snaps) {
// I'm not sure if you are reading your id this way...
// make sure you adapt this part to your use case
await db.collection('user').doc(snap.id).update({ deviceToken: "" })
}
res.status(200).send('Finished')
});
问题是异步代码没有按照你期望的方式工作,你可以按照自己的方式来做,并使用Promise.all来解决所有问题,这取决于你自己。
我建议使用批量写入请求(请参阅文档(。这样,所有更新都将在一个对firebase的请求中发生,您将节省执行时间。
请注意,如果您的用户集合中有500多个文档,则必须将请求分为多个批次(每个批次有500个更新(。
exports.changeDeviceToken = functions.https.onRequest(async (req, res) => {
let db = admin.firestore();
let batch = db.batch();
let userSnapshot = await db.collection('user').get();
userSnapshot.forEach(doc => {
batch.update(doc.ref, {
deviceToken: ""
});
});
await batch.commit();
res.status(200).send('Finished')
});