#firebase #data-structures #google-cloud-firestore
#firebase #google-cloud-platform #google-cloud-firestore #структуры данных
Вопрос:
Я создаю «глубокую» схему путей в Firestore. (путь из 6 частей, 3 коллекции и 3 документа) Что-то вроде collection/document/collection/document/collection/document
или в более реальном примере: comments/{category_name}/videos/{video_id}/usercomments/{auto_generated_id}
Итак, проблема в том, что Firestore позволяет добавлять документ во вложенную вложенную коллекцию по любому пути для документа, который в настоящее время не существует. Таким образом, при добавлении документа с комментарием пользователя в конце пути он автоматически добавит документы video_id
и category_name
, если они еще не существуют, но документы пусты (или, как указано в консоли, «не существуют») и, следовательно, не отображаются в запросах или моментальных снимках.
Что произойдет, так это то, что в usercomments
коллекции будет много документов, но я не могу получить список из video_ids
, потому что документы в videos
коллекции технически все «пустые».
Как я могу сохранить эту логическую схему path и при этом иметь возможность запрашивать документы более высокого уровня, в которых нет полей? Есть ли способ проверить при добавлении комментария, существует ли он video_id
в данный момент, и если нет, просто добавить поле типа boolean exists: true
?
РЕДАКТИРОВАТЬ: Я предполагаю, что единственным способом будет добавить поле exists: true
с помощью облачных функций при создании документа, но я не уверен, что создание документа в вложенной коллекции нового документа с клиента вызовет функцию для создания документа более высокого уровня или нет. Я обновлю, как только узнаю об этом.
ОБНОВЛЕНИЕ: Благодаря @Renaud Tarnec за информацию, я смог создать облачную функцию, которая установит для документов более высокого уровня поле, чтобы они «существовали» / фактически были созданы. Оказывается, вы можете извлечь все подстановочные знаки из контекста вложенного пути к документу в функции, чтобы динамически корректно редактировать поля документов более высокого уровня.
Ответ №1:
На самом деле, следующее утверждение в вашем вопросе не является точным: «он автоматически добавит документы video_id и category_name, если они еще не существуют».
Если вы создадите документ непосредственно под usercomments
коллекцией с полным путем comments/{category_name}/videos/{video_id}/usercomments
, никакие промежуточные документы не будут созданы (т.е. никаких comment
или video
docs).
Консоль Firebase выделяет их курсивом, чтобы «материализовать» иерархию и позволить вам перейти к usercomment
документу, но они не существуют в базе данных Firestore.
Давайте возьмем пример: представьте документ v1
под
comments/cat1/videos/v1
и еще один uc1
в разделе
comments/cat1/videos/v1/usercomments/uc1
На самом деле, с технической точки зрения они вообще не связаны друг с другом. Они просто разделяют часть своего пути, но ничего больше. Одним из побочных эффектов этого является то, что если вы удалите документ, его вложенные коллекции все еще существуют.
Итак, если вы хотите иметь возможность запрашивать эти родительские документы, вам придется создать их самостоятельно.
Комментарии:
1. Да, я понимаю, что технически они не существуют, когда нет полей, но означает ли это, что написание
onCreate()
облачной функции было бы бесполезно, потому что консоль только «материализует» документы, но на самом деле не создает их пустыми?2. Я предполагаю, вы имеете в виду наличие облачной функции, которая запускалась бы при создании
usercomment
документа. Как эта облачная функция будет узнавать идентификаторы и значения родительских документов? Они будут вusercomment
документе? Если да, почему бы вам не указать их во время созданияusercomment
документа (я полагаю, из вашего интерфейса)?3. И нет, родительские документы не «созданы пустыми», они просто не созданы вообще.
4. Нет, я имею в виду облачную функцию, которая запускается для документов более высокого уровня, которые не существуют при создании документа более низкого уровня. Например, когда создается
video_id
документ, который добавляет поле к видеодокументу. Похоже, что это может быть запущено не так, как вы это описываете…5. Облачная функция не будет запущена, потому что эти родительские документы (более высокого уровня) не созданы в базе данных.