我正在使用带有nodejs和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)
问题是,我需要一些更容易处理的东西,因为数组中可能有数千个元素。
考虑到所描述的问题,我认为您应该使用子集合(有时称为嵌套集合(。然而,从描述中很难判断你现在拥有什么。
Firestore收集结构总是这样的:
collection -> document -> fields and nestedCollections
nestedCollection
具有相同的结构,因此您可以根据需要嵌套整个结构多少次,但集合始终只包含文档,每个文档只包含字段和集合。
在呈现的集合中,描述数组直接在集合中或直接在文档中,这两者都是不可能的。
无论如何,我的想法是按照以下方式构建它:
- 包含各种restID文档的集合订单
- 每个文档(例如"someRestaurantId"(都包含名为ex的子集合;RestOrders">
- 在子集合中,将添加ID为(1,2,3等(的文档
- 子集合中的每个文档都有字段
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}
...
现在更新"0"的值;RestID_ 1";,订单;id 2";你可以使用:
db.collection('Orders')
.doc('RestID_1')
.collection('RestOrders')
.doc('2')
.update( {val: 4000} )
在上面的解决方案中,您可以避免读取和更新大数组。您只能更新嵌套子集合中一个文档的一个文件。