collectionGroup в пределах определенного пути - PullRequest
1 голос
/ 08 июля 2019

Я хотел бы сделать запрос к группе коллекций, но по определенному пути, что означает, что я хотел бы нацеливать коллекции не только с collectionId, но и с тем, где находится коллекция.

Давайте использовать примериспользуется в документе, чтобы объяснить это лучше.У нас были бы ориентиры в городах и «общие» ориентиры в их собственной коллекции:

let citiesRef = db.collection('cities');

let landmarks = Promise.all([
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Golden Gate Bridge',
    type: 'bridge'
  }),
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Legion of Honor',
    type: 'museum'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'Griffith Park',
    type: 'park'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'The Getty',
    type: 'museum'
  }),
  citiesRef.doc('DC').collection('landmarks').doc().set({
    name: 'Lincoln Memorial',
    type: 'memorial'
  })
]);

let generalLandmarks = Promise.all([
  db.collection('landmarks').doc().set({
    name: 'National Air and Space Museum',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Ueno Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({
    name: 'National Museum of Nature and Science',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Jingshan Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({ 
    name: 'Beijing Ancient Observatory',
    type: 'museum'
  })
]);

Теперь я хотел бы запросить ориентиры, которые находятся в городе, а не получить общие.Проще говоря, я хотел бы сделать что-то вроде этого:

let museums = db.collection('cities').collectionGroup('landmarks').where('type', '==', 'museum');

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

В настоящее время это невозможно в Cloud Firestore.Когда вы выполняете запрос группы коллекций, он будет использовать все коллекции и вложенные коллекции с заданным именем.Вы не можете сузить область действия запроса до определенных коллекций.

Вместо этого вы можете сохранить внутри документов в каждом подколлекции поле, которое идентифицирует, к какой коллекции верхнего уровня они принадлежат, а затем использовать это.поле для фильтрации ваших результатов.

0 голосов
/ 08 июля 2019

Теперь я хотел бы запросить ориентиры в городе, но не получить общие.

Нет, вы не можете.Запрос группы коллекций вернет результаты всех коллекций или вложенных коллекций с одинаковыми именами, включая общие.Вы не можете изменить это.

Решение для этого состоит в том, чтобы изменить имя ваших коллекций, чтобы оно было другим, если вы хотите ограничить объем запроса группы сбора.

ЕслиВаше приложение находится в продукте, и вы не можете изменить название своих коллекций, просто попробуйте проигнорировать результаты, которые вы получите на стороне клиента.Как этого добиться, просто посмотрите путь к документу и посмотрите, из каких коллекций он состоит.Таким образом, вы можете использовать только результат из нужной коллекции.

Другой обходной путь - добавить новое свойство типа boolean в ваши коллекции с именем isGeneral и установить его значение true в общей коллекции иложь в других.Чтобы получить только отдельные элементы, а не общие, добавьте к запросу запрос where:

whereEqualTo("isGeneral", false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...