我正在尝试编写一个事务,该事务首先从id列表中按documentId查询文档,然后进行一些更新。
我遇到了错误:
FieldPath.documentId()的对应值必须是字符串或DocumentReference。
例如:
const indexArray = [..list of doc ids...]
const personQueryRef = db.collection("person").where(admin.firestore.FieldPath.documentId(), "in", indexArray)
return db.runTransaction(transaction => {
return transaction.get(personQueryRef).then(personQuery => {
return personQuery.forEach(personRef => {
transaction.update(personRef, { ...update values here })
//more updates etc
})
})
})
我想在onCreate
和onUpdate
触发器中执行此操作。我应该采取另一种方法吗?
更新
当不使用事务时,错误仍然存在,因此与问题无关。
查询为.where(admin.firestore.FieldPath.documentId(), "==", "just_one_doc_id")
时不会发生此问题。因此,问题出在使用FieldPath.documentId()
和in
。
答案 0 :(得分:1)
这听起来像是SDK不支持您尝试执行的查询类型。我不知道这是否是故意的。但是,如果您要处理多个文档,并且已经知道它们的所有ID,则可以改用getAll(...):
// build an array of DocumentReference objects
cost refs = indexArray.map(id => db.collection("person").doc(id))
return db.runTransaction(transaction => {
// pass the array to getAll()
return transaction.getAll(refs).then(docs => {
docs.forEach(doc => {
transaction.update(doc.ref, { ...update values here })
})
})
})