集合中的Firebase Cloudfirestore更新元素

时间:2020-09-27 16:51:57

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

我正在使用带有basejs和cloudfirestore的firebase函数来构建API,现在我遇到了问题,我在集合内部有一个对象数组。

我的目标是仅更新特定元素,而不读取整个对象,然后再次推送。

这是我的“订单集合”的样子:

"someRestaurantId":[{id:1,desc:"test",val:3000},{id:2,desc:"test",val:4000},{id:4,desc:"test",val:5000}]

我的目标仅更新ID 2。

这是我一直在尝试的:

获取基于的完整列表

const document = db.collection('orders').doc(req.params.restId);

迭代并找到正确的元素,对其进行修改并再次更新。

await document.update(fullobject)

问题是我需要更容易处理的东西,因为该数组中可能有成千上万个元素。

1 个答案:

答案 0 :(得分:0)

考虑到所描述的问题,我认为您应该为此使用subcollection(有时称为嵌套集合)。但是,从描述中很难得知您现在拥有什么。

Firestore集合结构始终是这样的:

collection -> document -> fields and nestedCollections

nestedCollection具有相同的结构,因此您可以嵌套整个结构多少次,但是collection总是只包含文档,每个文档只包含字段和collection。

在提供的集合描述数组中,数组直接存在于集合中或直接存在于文档中,这两者都是不可能的。

无论如何,我的想法是按照以下方式进行构造:

  • 包含各种restID的文档的收货单
  • 每个文档(例如“ someRestaurantId”)都包含名称为ex的子集合。 “ RestOrders”
  • 在子集合中将添加ID为(1,2,3等)的文档
  • 子集合中的每个文档都将具有字段descval
Collection Orders:
    Document RestID_1:
         Subcolection RestOrders:
              Document 1: {val: 3000, desc: test}
              Document 2: {val: 3000, desc: test}
              ...
    Document RestID_2:
         Subcolection RestOrders:
              Document 1: {val: 3000, desc: test}
              Document 2: {val: 3000, desc: test}
              ...

现在要更新“ RestID_1”的值,可以使用“ id 2”命令:

db.collection('Orders')
 .doc('RestID_1')
 .collection('RestOrders')
 .doc('2')
 .update( {val: 4000} )

在上述解决方案中,您避免读取和更新大数组。您只能在嵌套子集合中更新一个文档的一个文件。