我正在使用带有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)
问题是我需要更容易处理的东西,因为该数组中可能有成千上万个元素。
答案 0 :(得分:0)
考虑到所描述的问题,我认为您应该为此使用subcollection(有时称为嵌套集合)。但是,从描述中很难得知您现在拥有什么。
Firestore集合结构始终是这样的:
collection -> document -> fields and nestedCollections
比nestedCollection
具有相同的结构,因此您可以嵌套整个结构多少次,但是collection总是只包含文档,每个文档只包含字段和collection。
在提供的集合描述数组中,数组直接存在于集合中或直接存在于文档中,这两者都是不可能的。
无论如何,我的想法是按照以下方式进行构造:
desc
,val
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} )
在上述解决方案中,您避免读取和更新大数组。您只能在嵌套子集合中更新一个文档的一个文件。