Firebase - Как добавить orderBy в составной запрос? - PullRequest
0 голосов
/ 23 февраля 2019

Скажем, у меня есть несколько фиктивных данных в моей коллекции users:

[
  {email: 'foo@bar.com', claims: {admin: true}}
  {email: 'foo1@bar.com', claims: {admin: true}}
  {email: 'foo2@bar.com', claims: {support: true}}
  {email: 'foo3@bar.com', claims: {support: true}}
  {email: 'foo4@bar.com', claims: {support: true}}
]

Затем у меня есть два запроса:

const admins = this.db.collection('users', (ref) => ref
 .where('claims.admin', '==', true));
const support = this.db.collection('users', (ref) => ref
 .where('claims.support', '==', true));

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

this.dataSub = combineLatest(
  admins.valueChanges(),
  support.valueChanges()
)
.pipe(
  map((items) => {
    return [].concat(...items);
  })
)
.subscribe((items) => {
  this.items = items;
});

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

const admins = this.db.collection('users', (ref) => ref
 .where('claims.admin', '==', true)
 .orderBy('email', 'asc'));
const support = this.db.collection('users', (ref) => ref
 .where('claims.support', '==', true)
 .orderBy('email', 'asc'));

И затем объединение результатов не приведет к правильной сортировке окончательного массива элементов, поскольку каждый список отсортирован по отдельности ..

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

1 Ответ

0 голосов
/ 23 февраля 2019

Вы выполняете два отдельных запроса в одной коллекции, а затем объединяете их в своем коде (с combineLatest).Здесь следует иметь в виду две вещи:

  1. Отдельные запросы могут содержать перекрывающиеся результаты.Например, документ с {email: 'foo@bar.com', claims: {admin: true, support: true}} появится в обоих запросах и, следовательно, будет в обоих результатах.Если ваш сценарий использования не гарантирует, что этого никогда не произойдет, вам необходимо решить, что делать с такими дублирующимися результатами.
  2. Поскольку существует два отдельных набора результатов, не существует определенного порядка для комбинированных результатов.Только вы можете определить, каким должен быть конечный заказ, а затем вам необходимо убедиться, что ваш код слияния гарантирует этот заказ.Я не эксперт по RxJS, но ожидаю, что вы сделаете это в операции pipe.
...