我尝试在Firebase上放置一个侦听器,它将复制Firestore中匹配元素中的值。
exports.synchronizeDelegates = functions.database.ref(`delegates/{userId}/activities`).onUpdate((event) => {
const userKey = event.data.ref.parent.key
console.log("User Key:" + userKey)
return admin.database().ref(`delegates/${userKey}/email`).once('value', snapshot => {
let email = snapshot.val()
console.log("Exported Email:" + email)
const userRef = admin.firestore().collection('users')
const firestoreRef = userRef.where('email', "==", email)
firestoreRef.onSnapshot().update({ activities: event.data.toJSON() })
}).then(email => {
console.log("Firebase Data successfully updated")
}).catch(err => console.log(err))
}
)
这个函数能够检索和定位在firestore中定位正确文档所需的元素,但是.update()
function仍然是错误firestoreRef.update is not a function
我尝试了几种方法来查询,但我仍然有这个错误。
如何正确查询然后在此方案中更新文档?
onSnapshot()的Query方法引入了一个持久的监听器,每次有新的QuerySnapshot可用时都会触发该监听器。它一直这样做,直到听取者取消订阅。这种行为绝对不是你想要的。此外,您的代码尝试调用QuerySnapshot上没有update()方法。
相反,看起来您希望使用get()来获取与您的查询匹配的文档列表,然后将它们全部更新:
exports.synchronizeDelegates = functions.database.ref(`delegates/{userId}/activities`).onUpdate((event) => {
const userId = event.params.userId
console.log("User Key:" + userKey)
return admin.database().ref(`delegates/${userId}/email`).once('value', snapshot => {
let email = snapshot.val()
console.log("Exported Email:" + email)
const usersRef = admin.firestore().collection('users')
const query = usersRef.where('email', "==", email)
const promises = []
query.get().then(snapshots => {
snapshots.forEach(snapshot => {
promises.push(snapshot.ref.update(event.data.val()))
})
return Promise.all(promises)
})
}).then(email => {
console.log("Firebase Data successfully updated")
}).catch(err => console.log(err))
}
请注意,我在函数中重写了一些非最佳的东西。
通常,熟悉Cloud Firestore API文档以了解您可以执行的操作是个好主意。