rxjs与Firestore查询不兼容

问题描述 投票:0回答:1

我正在尝试使用与distinct()成一定角度的rxjs获得不同的存储区值(客户端)。我得到的结果和以前一样。

{ id: '2224', city: 'chicago', name: 'jon' },
{ id: '33', city: 'chicago', name: 'bill' },
{ id '223' city: 'chicago', name: 'jon' }

这是我的代码:

query = this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
.valueChanges({ idField: 'id' })
.pipe(
  distinct((a: any) => a.name)
);

我得到所有结果,好像pipe不存在一样。

official doc开始,我希望得到这个:

{ id: '2224', city: 'chicago', name: 'jon' },
{ id: '33', city: 'chicago', name: 'bill' }

我应该手动使用switchMap还是其他方法来过滤结果?

angular google-cloud-firestore rxjs distinct
1个回答
0
投票

我相信,使用distinct()并不是适合您的用例的工具。您将得到一个完整的阵列作为响应,distinct将对单个排放起作用。

您可以将阵列转换为单独的发射,然后可以看到distict()正常工作。

this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
.valueChanges({ idField: 'id' })
.pipe(
 mergeMap((allDocs) => {
        return from(allDocs).pipe(distinct((eachDoc) => {
            return eachDoc.name;
        }))
    })
).subscribe((data) => {
  console.log(data);
});

这里您不会得到第二个“帐单”,但是,我认为您不需要这种响应,在这里您将获得单个对象而不是数组。这意味着,您的订阅回调将被调用相同的次数,内部的observable会发出。

解决方案:您可以自己过滤掉存储库,像这样的东西可能是一个很好的解决方案:

this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
  .valueChanges({ idField: 'id' })
  .pipe(
    map((allDocs) => {
      const auxObj = allDocs.reduce((acc, eachDoc) => {
        acc[eachDoc.name] = eachDoc;
        return acc;
      }, {});
      return Object.values(auxObj);
    })
).subscribe((data) => {
  console.log('filtered data', data);
})
© www.soinside.com 2019 - 2024. All rights reserved.