Как смоделировать подколлекцию Firestore с идентификатором вместо индекса - PullRequest
0 голосов
/ 14 июня 2019

У меня есть следующая модель 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 был уникальный идентификатор, а не индекс коллекции, например:

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

Я мог бы достичь этого, но удалив свойство children из моего класса Parent и сделав что-то вроде этого:

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 голосов
/ 15 июня 2019

Ваше свойство children выглядит следующим образом:

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

Поскольку оно имеет тип array.Таким образом, в вашем документе есть свойство типа array, которое содержит Child объектов, а 0 и 1 являются индексами массива.Если вы хотите изменить это поведение, измените тип вашей собственности с array на Map.В этом случае у вас будет карта Child объектов, и вы можете установить идентификаторы по своему усмотрению.В этом случае ваша структура базы данных будет выглядеть так:

Firestore-root
   |
   --- parent (collection)
         |
         --- docId (document)
              |
              --- id: "docId"
              |
              --- children
                    |
                    --- yourCustomId: CHILD1
                    |
                    --- yourCustomId: CHILD2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...