如何使用ID而不是索引对Firestore子集合建模

时间:2019-06-14 15:32:56

标签: typescript firebase google-cloud-firestore

我有以下Typescript模型:

export class Parent{
 id: string;
 children: Child[];
}

export class Child {
 id: string;
}

我在Firestore中添加这样的父母:

admin.firestore().collection('parent').doc(p.id).set(p);

结果如下:

Parents: [PARENT_ID] { id: PARENT_ID, children: [[0]: { CHILD1 }, [1]: {CHILD2 }}

我想要的是我的subCollection子代将其id作为唯一键,而不是像这样的集合索引:

Parents: [PARENT_ID] { id: PARENT_ID, children: [[CHILD_ID_1]: { CHILD1 }, [CHILD_ID_2]: {CHILD2 }}

我可以实现这一点,但可以从Parent类中删除children属性,然后执行以下操作:

admin.firestore().collection('parent').doc(p.id).set(p);
children.forEach(c => admin.firestore().collection('programs').doc(p.id).collection(c.id).set(c);

但是有什么办法可以更改我的打字稿模型,以便我可以存储一次父项并将child.id作为键而不是索引?

1 个答案:

答案 0 :(得分:0)

您的children属性如下所示:

children: [[0]: { CHILD1 }, [1]: {CHILD2 }}

因为它是数组类型。因此,您在文档中拥有一个数组类型的属性,该属性包含Child个对象,并且01是数组的索引。如果要更改此行为,请将属性的类型从array更改为Map。在这种情况下,您将有一个Child对象的映射,并且可以根据需要设置ID。在这种情况下,您的数据库结构将如下所示:

Firestore-root
   |
   --- parent (collection)
         |
         --- docId (document)
              |
              --- id: "docId"
              |
              --- children
                    |
                    --- yourCustomId: CHILD1
                    |
                    --- yourCustomId: CHILD2