【问题标题】:Add data to Cloud Firestore in Loop在循环中将数据添加到 Cloud Firestore
【发布时间】:2018-06-21 16:21:49
【问题描述】:

我有一个嵌套的 json,它有一个键和值是另一个带有键和值的 json。下面是json。

        {
            "Testicular Torsion": {
                "What is testicular torsion?": "ABC",
                "Symptoms": "AB",
                "Risks": "AL",
                "Diagnosis": "LK",
                "Treatment": "UY"
            },
             "XYZ": {
                "X": "ABC",
                "Symptoms": "AB",
                "Risks": "AL",
                "Diagnosis": "LK",
                "Treatment": "UY"
            }
    };

我想要做的是将数据插入到 Firebase 的云 Firestore 中。以下是相同的代码。但问题是,只有第一个键值对(在这种情况下是睾丸扭转键和它的值是另一个 JSON)被插入,而不是其他键值对。为什么会这样,代码中需要做什么?

var string_medical_data = JSON.stringify(medical_json);
var json_medical = JSON.parse(string_medical_data);

function abc(poi){
  firestore.collection('medical').doc(poi).set(json_medical[poi])
    .then(() => {
      return console.log("Added");
  })
  .catch((e => {
    console.log('error: ', e);
    return console.log(e);
  }))
}


exports.medical = functions.https.onRequest((request, response) => {

  var problems = [];
  for(var myKey in json_medical) {
   problems.push(myKey);
   break;
}

for(var i=0;i<problems.length;i++){

  // firestore.collection('medical').doc(problems[i]).set(json_medical[problems[i]])

  abc(problems[i]);

}

response.send({
  'fulfillmentText': `Success!!!`
});

});

【问题讨论】:

  • 您在循环中无条件地使用break - 这将导致该循环仅执行一次。此外,您需要让您的函数等到对set() 的所有调用都完成。您应该将所有这些承诺收集到一个数组中,并在它们全部完成后使用Promise.all() 发送响应。
  • 感谢您的回复。 break 是一个有效的逻辑错误,我现在已将其删除,但由于 nodejs 使用异步调用,我仍然无法添加数据。你能告诉我如何按照上述代码执行 Promise.all 的代码 sn-p。

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


【解决方案1】:

您最好在batch request 中执行此操作。您可以在单个请求中提交多个写入。如果您的数据有超过 500 个条目,您必须将其分解并一次完成 500 个。

exports.medical = functions.https.onRequest((request, response) => {
  var batch = firestore.batch();
  for(var myKey in json_medical) {
    var myKeyRef = firestore.collection('medical').doc(myKey);
    batch.set(myKeyRef, json_medical[myKey]);
  }
  batch.commit().then(function () {
    response.send({
      'fulfillmentText': `Success!!!`
    });
  });
});

【讨论】:

  • 嗨@abraham 这个解决方案就像一个魅力,我能够一次添加我所有的条目,我已经无法添加这么多天了。非常感谢:)
  • 太棒了!不要忘记将问题标记为已回答。
  • 最佳答案!简单有效。干杯!
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 2022-11-11
  • 1970-01-01
  • 2023-04-07
  • 2021-06-25
  • 2019-02-02
  • 2018-04-17
  • 2021-06-26
相关资源
最近更新 更多