【问题标题】:Get map of map field from Firestore从 Firestore 获取地图字段的地图
【发布时间】:2020-12-14 01:18:24
【问题描述】:

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

我正在尝试使用 node.js 中的云函数检索这些数据。我可以从字段中获取文档和数据,但我无法以可用的方式获取它。我已经尝试了我可以在 SO 和 google 上找到的所有解决方案,但下面是唯一可以让我访问数据的代码。我显然需要能够单独访问地图中的每个字段。在swift中我构建了一个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) });

这就是我在控制台中返回的内容。

在 Swift 中,我执行以下操作,但目前无法在 typescript 中找到等效项。 (我不需要构建自定义对象,只需能够访问键和值)

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 倍的对象。

【问题讨论】:

  • 所以每次运行控制台都会随机输出?
  • 您的日志输出看起来与您的代码不匹配。每个日志行都包含字符串“testingProcess”,但我在您的代码中的任何地方都看不到它。无论如何,您正在记录的对象中肯定有数据,我认为输出会向您建议如何访问对象的字段。我不清楚你在哪里卡住只是访问你正在记录的对象的属性。
  • @DougStevenson testingProcess 是函数的名称。
  • @Gieted 是的,每次我运行它时,我都会以不同的顺序获得日志输出,它永远不会作为一个对象记录为多行。

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


【解决方案1】:

因此,经过两天的搜索,我终于找到了一个解决方案,它与上面的代码非常相似,但这是可行的。它可能不是“正确”的方式,但它有效。随时提出其他建议。

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) });

【讨论】:

    【解决方案2】:

    我把它做成了一个从地图中获取底层对象的小函数:

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

    对于在 firestore 中具有 maps 数组的对象,您可以像这样获取其中第一个映射的值:

    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' }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-29
      • 2021-07-20
      • 2019-09-30
      • 1970-01-01
      • 2021-01-06
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多