带有 .where() 文档参考的云函数 batch()
Cloud function batch() with a .where() doc reference
我有一个 collection 名为“广告”
/adverts/{advert_id} <-- 其中 advert_id 是由 firestore 自动生成的。
我有 collection 个“用户”
/user/{user_id} <--- 其中 user_id 由用户名
定义
所以在“广告”文档中我有下一张地图
user_data:{
avatar_url: "",
first_name: "example name",
last_name: "example last name",
rating: 5,
username: "exampleusername"
}
每次创建广告时,此信息都来自用户文档。所以我想在广告 collection 中更新这张地图,每次用户更新他的数据时。
假设广告中可能存在多个文档,是否可以批量更新此字段? (我尽量避免读取所有文件并重写它们,我只想写)
我试图通过(是一个 onUpdate 云函数)实现这一点:
const before = change.before.data(); // Data before the update
const after = change.after.data(); // Data after the update
const user_id = after.username;
let batch = db.batch()
let advertsRef = db.collection("adverts").where("user_data.username", "==", user_id)
batch.update(advertsRef, {
"user_data.avatar_url": after.avatar_url,
"user_data.first_name": after.first_name,
"user_data.last_name": after.last_name,
"user_data.overall_adverts_rating": after.overall_adverts_rating,
"user_data.username": after.username,
})
batch.commit().then(()=>{
console.log("done")
})
.catch(error =>{
console.log(error)
})
但我遇到下一个错误:
Error: Value for argument "documentRef" is not a valid DocumentReference.
at Object.validateDocumentReference (/workspace/node_modules/@google-cloud/firestore/build/src/reference.js:2034:15)
at WriteBatch.update (/workspace/node_modules/@google-cloud/firestore/build/src/write-batch.js:312:21)
at /workspace/index.js:147:9
at cloudFunction (/workspace/node_modules/firebase-functions/lib/cloud-functions.js:134:23)
at /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:199:28
at processTicksAndRejections (internal/process/task_queues.js:97:5)
我猜是因为我的 .where() 没有引用特定文件。
在您的云函数中,您需要遍历每个匹配的广告。 IE。您正在重写与查询匹配的所有文档,这意味着您需要阅读每个文档并更新每个文档。例如
let adverts = await db.collection("adverts").where("user_data.username", "==", user_id).get
for (doc of adverts.docs) {
doc.user_data = after
batch.update(doc)
}
await batch.commit()
我有一个 collection 名为“广告”
/adverts/{advert_id} <-- 其中 advert_id 是由 firestore 自动生成的。
我有 collection 个“用户” /user/{user_id} <--- 其中 user_id 由用户名
定义所以在“广告”文档中我有下一张地图
user_data:{
avatar_url: "",
first_name: "example name",
last_name: "example last name",
rating: 5,
username: "exampleusername"
}
每次创建广告时,此信息都来自用户文档。所以我想在广告 collection 中更新这张地图,每次用户更新他的数据时。
假设广告中可能存在多个文档,是否可以批量更新此字段? (我尽量避免读取所有文件并重写它们,我只想写)
我试图通过(是一个 onUpdate 云函数)实现这一点:
const before = change.before.data(); // Data before the update
const after = change.after.data(); // Data after the update
const user_id = after.username;
let batch = db.batch()
let advertsRef = db.collection("adverts").where("user_data.username", "==", user_id)
batch.update(advertsRef, {
"user_data.avatar_url": after.avatar_url,
"user_data.first_name": after.first_name,
"user_data.last_name": after.last_name,
"user_data.overall_adverts_rating": after.overall_adverts_rating,
"user_data.username": after.username,
})
batch.commit().then(()=>{
console.log("done")
})
.catch(error =>{
console.log(error)
})
但我遇到下一个错误:
Error: Value for argument "documentRef" is not a valid DocumentReference.
at Object.validateDocumentReference (/workspace/node_modules/@google-cloud/firestore/build/src/reference.js:2034:15)
at WriteBatch.update (/workspace/node_modules/@google-cloud/firestore/build/src/write-batch.js:312:21)
at /workspace/index.js:147:9
at cloudFunction (/workspace/node_modules/firebase-functions/lib/cloud-functions.js:134:23)
at /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:199:28
at processTicksAndRejections (internal/process/task_queues.js:97:5)
我猜是因为我的 .where() 没有引用特定文件。
在您的云函数中,您需要遍历每个匹配的广告。 IE。您正在重写与查询匹配的所有文档,这意味着您需要阅读每个文档并更新每个文档。例如
let adverts = await db.collection("adverts").where("user_data.username", "==", user_id).get
for (doc of adverts.docs) {
doc.user_data = after
batch.update(doc)
}
await batch.commit()