【问题标题】:How to add multiple map objects (JSON's) to cloud-firestore database?如何将多个地图对象(JSON)添加到 cloud-firestore 数据库?
【发布时间】:2019-11-16 14:10:25
【问题描述】:

我有一个函数可以为我的 Cloud Firestore 数据库设置一个 JSON:

app.post('/api/add/collection/:collection_id/permission/:permission_id', (req, res) => {
(async () => {
    try {
        await db.collection(req.params.collection_id)
            .doc(req.params.permission_id)
            .set({
                [req.body.id]: {
                    name: req.body.name,
                    email: req.body.email,
                    phone_number: req.body.phone_number
                }
            }, { merge: true}
            );

        return res.status(200).send('OK');
    } catch (error) {
        console.log(error);
        return res.status(500).send('ERROR' + error);
    }
})();
});

为了调用这个函数,我将 JSON 正文传递给 POST 请求:

https://.../app/api/add/collection/USER_ID/permission/PERMISSION_id

{
    "id": 45,
    "name": "Stack",
    "email": "stack@overflow.com",
    "phone_number": "+48 111 222 333"
}

一切正常,此请求将此 JSON 设置为以 id 作为键的映射,并将值设置为 nameemailphone_number。但是我想在一个请求中传递几个 JSON 以将多个地图对象添加到我的 NoSQL 文档中,例如:

[
    {
        "id": 45,
        "name": "Stack",
        "email": "stack@overflow.com",
        "phone_number": "+48 111 222 333"
    },
    {
        "id": 46,
        "name": "Stack2",
        "email": "stack2@overflow.com",
        "phone_number": "+48 222 222 333"
    },
    {
        "id": 47,
        "name": "Stack3",
        "email": "stack3@overflow.com",
        "phone_number": "+48 333 222 333"
    }
]

如何修改我的firebase函数来实现这个?

【问题讨论】:

  • 您显示的最后一个代码块不是有效的 JSON 对象。当您发送要写入数据库的请求时,您能显示req.body 的输出吗?
  • @FrankvanPuffelen 我已将 JSON 编辑为有效。我想发送如上所示的 JSON 数组。

标签: javascript firebase express google-cloud-firestore http-post


【解决方案1】:

由于您有一个对象数组,因此您需要遍历该数组,然后为每个对象创建一个文档。而且由于您需要等到所有文档都创建完毕,您可以使用Promise.all()

类似这样的:

try {
    await Promise.all(req.body.map((object) => {
        return db.collection(req.params.collection_id)
          .doc(req.params.permission_id)
          .set({
            [object.id]: {
                name: object.name,
                email: object.email,
                phone_number: object.phone_number
            }
          }, { merge: true});
    });
    return res.status(200).send('OK');
} catch (error) {
    console.log(error);
    return res.status(500).send('ERROR' + error);
}

【讨论】:

  • 使用batched write 而不是Promise.all() 可能更有意义,这样整个集合要么一起成功,要么一起失败。
  • 这是一个选项,但我没有看到这些对象之间有任何关系。在这种情况下,批量写入不会添加任何内容,并且通常比单独写入要慢。
  • 我想这取决于正在服务的(单个)请求中的错误处理是如何完成的——如果部分写入正常,那么没问题。
  • 我将针对该文档页面提交错误报告,因为该声明不正确。开销的差异很小,并且使用批处理删除了并行化调用的选项。与减少开销相比,后者更有可能对性能产生积极影响。
  • 我决定试一试,并将我的发现写在一个单独的答案中:stackoverflow.com/q/58897274
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多