gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:18:14 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于javascript - Firebase - 如何将 orderBy 添加到复合查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54842806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com