как мне выполнить запрос collectionGroup, но получить документы, внутри которых находится вложенная коллекция?

#firebase #google-cloud-firestore

#firebase #google-облако-firestore

Вопрос:

как мне выполнить запрос collectionGroup, но получить документы, внутри которых находится вложенная коллекция. Мои данные структурированы следующим образом: Users (collection) -> UID(doc) -> privateData (collection) -> UID (doc) и я хочу запросить на основе поля в UID doc в privateData collection , но мне нужны фактические данные из UID Doc в Users collection

Ответ №1:

Вы не можете выполнять запросы по нескольким коллекциям подобным образом. Если вам нужны данные из другой вложенной коллекции, то ваш запрос группы коллекций должен быть нацелен на эту другую вложенную коллекцию. Это означает, что вам, вероятно, придется дублировать поля из коллекции PrivateData в коллекцию Users. Дублирование данных полей часто встречается в базах данных nosql, таких как Firestore.

Если вы не можете дублировать эти данные по какой-либо причине (например, из-за конфиденциальности), тогда вам нужно будет запрашивать каждый связанный документ отдельно, эффективно соединяя документы каждого пользователя с соответствующим документом в PrivateData.

Комментарии:

1. Итак, в принципе, нет хорошего способа, например, получить все имена и фамилии людей, которые находятся в радиусе 10 миль от меня, если данные о местоположении хранятся в вложенной коллекции?

2. Что мне нужно было бы сделать, так это запрос collection group, который выдал бы мне все идентификаторы пользователей, которых я хочу получить, затем вызвать getDocument для каждого из этих идентификаторов?

3. С вашей текущей моделью данных невозможно получить ее одним запросом. Как я сказал в своем ответе, вам нужно будет либо дублировать данные, либо извлекать связанные документы отдельно.

4. Как бы вы предложили мне изменить мою модель данных? У меня есть данные о местоположении в частной вложенной коллекции, поэтому о дублировании данных для меня не может быть и речи

5. Скопируйте поля из данных, необходимых для запроса, в документы в коллекции users.

Ответ №2:

В зависимости от вашей модели данных вам потребуется ссылка на родительский документ для вложенной коллекции в дочернем объекте, или извлеките документ и, используя моментальный снимок документов, вы можете вызвать его родительскую ссылку примерно так: querySnapshot.docs()[x].snapshot.getRef().getParent()