【问题标题】:Firebase - How to add orderBy to compound query?Firebase - 如何将 orderBy 添加到复合查询?
【发布时间】:2019-07-17 11:25:18
【问题描述】:

假设我的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'));

然后组合结果不会使最终的项目数组正确排序,因为每个列表都是单独排序的..

感觉这应该记录在某个地方,但事实并非如此,我该怎么做?

【问题讨论】:

    标签: javascript firebase rxjs google-cloud-firestore angularfire2


    【解决方案1】:

    您正在对同一个集合执行两个单独的查询,然后将它们合并到您的代码中(使用combineLatest)。这里有两点要记住:

    1. 单独的查询可能包含重叠的结果。例如,带有{email: 'foo@bar.com', claims: {admin: true, support: true}} 的文档将出现在两个查询中,因此同时出现在两个结果中。除非您的用例保证这永远不会发生,否则您需要决定如何处理此类重复结果。
    2. 由于有两个单独的结果集,因此没有定义组合结果的顺序。只有您可以确定您想要的最终订单是什么,然后您需要确保您的合并代码确保该订单。我不是 RxJS 专家,但希望您会在 pipe 操作中执行此操作。

    【讨论】:

    • 1.他们永远不可能两者兼得。 2.您基本上只是重复了我在问题中已经说过的内容。所以答案是否定的,如果不通过 Algolia/ElasticSearch 或通过前端代码排序,您就无法做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多