从Firestore获取地图字段的地图

时间:2020-08-25 10:52:29

标签: node.js typescript google-cloud-firestore google-cloud-functions

我有一个map类型的字段,其中包含firestore中的数据地图。

enter image description here

我正在尝试使用node.js中的云函数检索此数据。我可以从现场获取文档和数据,但无法以可用的方式获取。我已经尝试了所有可以在SO和Google上找到的解决方案,但是以下是唯一可以让我访问数据的代码。我显然需要能够单独访问Map中的每个字段。我很快建立了一个String:Any数组,但是我可以在Node.JS中使用它

const docRef = dbConst.collection('Comps').doc('XEVDk6e4AXZPkNprQRn5Imfcsah11598092006.724980');

return docRef.get().then(docSnap => {

 const tagets = docSnap.get('targets')

 console.log(tagets);

}).catch(result => { console.log(result) });

这就是我在控制台中得到的。

enter image description here

在Swift中,我执行以下操作,到目前为止,我无法在打字稿中找到等效项。 (我不需要构建自定义对象就可以访问键和值)

let obj1 = doc.get("targets") as! [String:Any]
                        
                        for objs in obj1{
                            let obs = objs.value as! [String:Any]
                            let targObj = compUserDetails(IDString: objs.key, activTarg: obs["ActivTarget"] as! Double, stepTarg: obs["StepTarget"] as! Double, name: obs["FullName"] as! String)

更新 花了整整一天的时间后,我认为我可以使用以下解决方案:

const docRef = dbConst.collection('Comps').doc('XEVDk6e4AXZPkNprQRn5Imfcsah11598092006.724980');

return docRef.get().then(docSnap => {
const tagets = docSnap.get('targets') as [[string, any]];
const newDataMap = [];

for (let [key, value] of Object.entries(tagets)) {
  const tempMap = new Map<String,any>();
  console.log(key);

  const newreWorked = value;

  tempMap.set('uid',key);

  for(let [key1, value1] of Object.entries(newreWorked)){
    tempMap.set(key1,value1);
    newDatMap.push(tempMap);
  };

};

  newDatMap.forEach(element => {
    const name = element.get('FullName');
    console.log(name);
  });

但是,新数据映射具有6个单独的映射对象。来自云的每个原始对象中的3个。我现在可以遍历并获取给定密钥的数据,但是我有3倍的对象。

2 个答案:

答案 0 :(得分:0)

因此,在经过两天的搜索之后,我终于找到了解决方案,它与上面的代码非常相似,但是可以正常工作。它可能不是“正确”的方法,但可以。随时提出其他建议。

return docRef.get().then(docSnap => {
const tagets = docSnap.get('targets') as [[string, any]];
const newDatarray = [];

for (let [key, value] of Object.entries(tagets)) {
  const tempMap = new Map<String,any>();
  const newreWorked = value;
  tempMap.set('uid',key);

  for(let [key1, value1] of Object.entries(newreWorked)){
    tempMap.set(key1,value1);
  };
  newDatarray.push(tempMap);
};

  newDatarray.forEach(element => {
    const name = element.get('FullName');
    const steps = element.get('StepTarget');
    const avtiv = element.get('ActivTarget');
    const UID = element.get('uid');
    console.log(name);
    console.log(steps);
    console.log(avtiv);
    console.log(UID);
  });

 

}).catch(result => { console.log(result) });

答案 1 :(得分:0)

我将其变成一个小的函数,该函数从地图中获取基础对象:

function getMappedValues(map) {
    var tempMap = {};
    for (const [key, value] of Object.entries(map)) {
        tempMap[key] = value;
    }
    return tempMap;
}

对于在Firestore中具有map数组的对象,您可以像下面这样获得其中第一个映射的值:

let doc = { // Example firestore document data
    items: {
        0: {
            id: "1",
            sr: "A",
        },
        1: {
            id: "2",
            sr: "B",
        },
        2: {
            id: "3",
            sr: "B",
        },
    },
};

console.log(getMappedValues(doc.items[0]));

它将显示为{ id: '1', sr: 'A' }