我有一个map类型的字段,其中包含firestore中的数据地图。
我正在尝试使用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) });
这就是我在控制台中得到的。
在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倍的对象。
答案 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' }