代码之家  ›  专栏  ›  技术社区  ›  Chrillewoodz

Firebase-如何将orderBy添加到复合查询?

  •  2
  • Chrillewoodz  · 技术社区  · 7 年前

    假设我的电脑里有一些虚拟数据 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 但这到底是怎么回事?放置 订货人 比如:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Frank van Puffelen    7 年前

    在同一个集合上执行两个单独的查询,然后将它们合并到代码中(使用 combineLatest ). 这里要记住两件事:

    1. 单独的查询可能包含重叠的结果。例如,具有 {email: 'foo@bar.com', claims: {admin: true, support: true}}
    2. 由于有两个独立的结果集,因此没有为组合结果定义顺序。只有您可以确定您想要的最终顺序,然后您需要确保您的合并代码确保该顺序。我不是RxJS专家,但我希望你能在 pipe
    推荐文章