Firebase:如何在typescript/cloud函数中创建或访问地图
我的文件里有一张地图。我们就叫它地图吧。结构看起来像这样Firebase:如何在typescript/cloud函数中创建或访问地图,typescript,firebase,google-cloud-functions,Typescript,Firebase,Google Cloud Functions,我的文件里有一张地图。我们就叫它地图吧。结构看起来像这样 -document -map {id: number} {id2: number2} 现在,函数第一次执行时,只有文档存在,我想用第一个条目创建映射 第一次执行前 -document -document -map {id: number} 第一次执行后 -document -document -map {id: number} 现在,无论何时使用id执行,我都会增
-document
-map
{id: number}
{id2: number2}
现在,函数第一次执行时,只有文档存在,我想用第一个条目创建映射
第一次执行前
-document
-document
-map
{id: number}
第一次执行后
-document
-document
-map
{id: number}
现在,无论何时使用id执行,我都会增加存储在映射中的数字
但是如果id不在地图中,它就会被插入
例如,使用id2调用它将产生开头显示的结构
await admin.firestore().runTransaction(async t => {
const documentDb= await admin.firestore().doc(`document/${documentId}`).get()
const document= documentDb.data()!
if (document.map === undefined || document.map[id] === undefined) {
const tempMap = {};
tempMap[id] = 1
document.map = tempMap
}else{
document.map[id] = document.map[id]+1
}
t.update(documentDb.ref, document);
}
这不起作用(实际上它甚至没有编译。Typescript在这里抱怨
tempMap[id]=1
,因为有一个隐式的“any”类型。我怎么能实现这个(我想很简单)任务?const tempMap:{[key:string]:any}={}
应该解决“any”类型的问题
此外,请注意,您不应执行documentDb=await admin.firestore().doc(`document/${documentId}').get()
来获取文档,而应使用事务处理的方法:
const documentRef = admin.firestore().doc(`document/${documentId}`);
const snapshot = await t.get(documentRef);
const document= snapshot.data()!;
//...
更新:如何更新地图
const id = ...;
const updatePath = 'map.' + id; // or id.toString(10)
const obj = {};
obj[updatePath] = document.map[id] + 1;
t.update(documentDb.ref, obj);
const tempMap:{[key:string]:any}={}
应该能够解决“any”类型的问题
此外,请注意,您不应执行documentDb=await admin.firestore().doc(`document/${documentId}').get()
来获取文档,而应使用事务处理的方法:
const documentRef = admin.firestore().doc(`document/${documentId}`);
const snapshot = await t.get(documentRef);
const document= snapshot.data()!;
//...
更新:如何更新地图
const id = ...;
const updatePath = 'map.' + id; // or id.toString(10)
const obj = {};
obj[updatePath] = document.map[id] + 1;
t.update(documentDb.ref, obj);
谢谢。任何类型的问题都消失了。关于另一个问题:我以前也犯过同样的错误,你们帮我省去了麻烦。我还修复了第二个问题,这个问题来自原始代码,但我简化了它。我现在要测试这个问题。我刚刚意识到,如果已经有一个映射,但只有一个n,代码就无法覆盖映射添加了ew Id。若我的答案解决了您的问题,如您的问题中所述,请接受并投票。请参阅。更新地图,请参阅更新。谢谢。任何类型的问题都消失了。关于另一个问题:我以前犯过同样的错误,您刚刚为我省去了麻烦。我还修复了第二个问题,这来自原始问题代码,但我对此进行了简化。我现在将对此进行测试。我刚刚意识到,如果已经有地图,但只添加了一个新Id,则代码无法工作,因为它会覆盖地图。如果我的答案解决了您的问题,如您的问题所述,请接受并投票。请参阅。有关更新地图,请参阅更新。