假设我的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'));
然后合并结果将不会使最终的项目数组正确排序,因为每个列表都是单独排序的。
感觉应该记录在某处,但事实并非如此,我该怎么办?
答案 0 :(得分:0)
您要在同一个集合上执行两个单独的查询,然后将它们合并到您的代码中(使用combineLatest
)。这里有两件事要记住:
{email: 'foo@bar.com', claims: {admin: true, support: true}}
的文档将出现在两个查询中,因此同时出现在两个结果中。除非您的用例保证永远不会发生这种情况,否则您将需要决定如何处理这种重复的结果。pipe
操作中执行此操作。