получить данные do c, где значение условия - это значение вложенной коллекции - PullRequest
0 голосов
/ 16 апреля 2020

Моя база данных в Firestore выглядит следующим образом:

Candidates
    |
    |______ID_1
    |        |_______likeDislikeSuper
    |        |              |___________ID_1
    |     ( data )                        |_______value: n
    |
    |______ID_2
    |        |_______likeDislikeSuper
    |        |              |___________ID_2
    |     ( data )                        |_______value: n

Я хочу получить (данные) из кандидатов, где значение == n

firestore()
  .collection('candidates')
  .where('candidates/ID_1/likeDislikeSuper/ID_1', '==', 'n')
  .get();

** Кандидаты - это коллекция, идентификаторы are do c, likeDislikeSuper - это подколлекция кандидатов.

, так что ... первые параметры where это camp value, не поддерживает path

делает Кто-нибудь знает, как обойти эту проблему?

как я могу вернуть документы-кандидаты, используя это значение в качестве фильтра?

enter image description here

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Если я правильно понимаю, вам нужно использовать запрос группы сбора , как указано ниже:

var likeDislikeSuperQuery = db.collectionGroup('likeDislikeSuper').where('value', '==', 'n');
likeDislikeSuperQuery.get().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
        console.log(doc.id, ' => ', doc.data());
    });
});

Запрос вернет все документы в подколлекциях likeDislikeSuper ( всех кандидатов ) с полем value, равным 'n'.


Обновите после вашего комментария:

Если вы хотите чтобы получить все документы candidates, которые являются родительскими для документов likeDislikeSuper, возвращаемых этим запросом, вы могли бы сделать следующее:

var likeDislikeSuperQuery = db.collectionGroup('likeDislikeSuper').where('value', '==', 'n');
likeDislikeSuperQuery.get().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
        const parentCandidateRef = doc.ref.parent.parent;
        console.log('parentCandidate path: ', doc.ref.parent.parent.path);
    });
});

Однако это не самый эффективный подход, поскольку несколько likeDislikeSuper документы могут иметь одного и того же родительского candidates документа.

Вы можете дублировать свои данные и, например, иметь основную коллекцию likeDislike документов для каждого идентификатора лайкера / дислайкера, которая содержит массив candidateId s (или подколлекцию candidates документа если вы считаете, что массив может быть настолько большим, что документ достигнет предела размера 1 МБ ).

0 голосов
/ 16 апреля 2020

Если вы хотите запросить пользовательскую вложенную коллекцию likeDislikeSuper, вам нужно создать на нее коллекцию CollectionReference:

firestore()
  .collection('candidates')
  .doc('ID_1')
  .collection('likeDislikeSuper')
  .where('ID_1', '==', 'n')
  .get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...