Как построить цепочку запросов Firestore на основе динамического ответа c от обещания - PullRequest
0 голосов
/ 24 марта 2020

Допустим, мне нужно запросить в Firestore набор предметов, которые я получаю в обещании:

const subjects: string[] = await getSubjects(); //response: ['Math', 'Science', 'History'];

Поскольку я не знаю, сколько предметов может быть возвращено в обещании в любой момент времени Как бы я go о динамическом генерировании цепочки ниже, чтобы я мог правильно запросить Firestore?

ref.where('subject[subjects[0].toLowerCase()]', '==' , true)
    .where('subject[subjects[1].toLowerCase()]', '==' , true)
    .where('subject[subjects[2].toLowerCase()]', '==' , true);

Чем больше возвращаемых предметов, тем больше .where() методов нужно будет сгенерировать.

1 Ответ

1 голос
/ 24 марта 2020

Создание запроса следует шаблону построителя: когда вы вызываете where, он возвращает Query, и на этом Query вы можете снова вызвать where.

Так что, если у вас есть массив Темы, и вы хотите создать запрос из них, вы можете сделать:

var query = firebase.firestore().collection("bla");
['Math', 'Science', 'History'].forEach((subject) => {
   query = query.where(`subject[${subject}.toLowerCase()]'`, '==' , true);
})
query.get()....

Обратите внимание, что в настоящее время Firestore поддерживает оператор array-contains-any, который значительно лучше масштабируется для этих типов операций и может работать с до 10 предметов одновременно.

Чтобы использовать это, ваши документы должны будут содержать массив subjects, например:

subjects: ['Math', 'Biology']

И тогда вы запросить его с помощью:

var query = firebase.firestore().collection("bla")
  .where('subjects', 'array-contains-any', ['Math', 'Science', 'History']);
query.get()...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...