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,则代码无法工作,因为它会覆盖地图。如果我的答案解决了您的问题,如您的问题所述,请接受并投票。请参阅。有关更新地图,请参阅更新。