【问题标题】:Angular/Firestore Sum the values of an Array of Objects inside a documentAngular/Firestore 对文档中对象数组的值求和
【发布时间】:2020-04-23 13:59:16
【问题描述】:

我在 Firestore 集合中有一个包含多个键值的文档,其中一个是对象数组,我想计算该 ID 的数组“会话”内的键“订单”的所有值的总和.

{
      id: "asdSDWESHGawhadah",
      name: "John",
      lastName: "Doe",
      age: "20",
      sessions: [

        {
          orders: 1
          date: 2019 - 11 - 24
        },
        {
          orders: 5
          date: 2019 - 11 - 26
        },
        {
          orders: 4,
          date: 2019 - 11 - 29
        },
      ],
    }

我无法在 HTML 中显示总和的结果(在本例中为 10)。 我尝试在组件的打字稿中执行此操作,在该组件中调用为我提供文档的服务,但是该变量是带有我的接口的 Observable,因此我无法使用 map 或 reduce,我知道有一种使用 RxJs 的方法,我可以找不到一个很好的例子来理解,据我所知,它很复杂。 有没有一种简单的方法可以直接从 Firestore 获取总和结果?

constructor(
private fbservice: FirebaseService,) {  }

  ngOnInit() {

        this.fbpatient$ = this.fbservice.getOnePatient(idPatient);  

  }
getOnePatient 方法为我带来了包含所有会话的数据,其中包含我想要求和的值 但正如我所说,我不能像使用 Observable 的普通 javascript 对象那样使用 fbpatient$。

谢谢

【问题讨论】:

    标签: angular google-cloud-firestore


    【解决方案1】:

    您可以通过使用 RXJS 地图运算符来解决这个问题,如下所示:

    mySumObservable$ = this.fbservice.getOnePatient(idPatient).pipe(
      map(patient => {
        return patient.sessions.reduce((sum, session) => sum + session, 0);
      })
    );
    

    然后,您可以通过在代码中订阅 mySumObservable$ 来获取总和,例如:

    mySumObservable$.subscribe(sum => this.patientSum = sum);
    

    或者通过在你的 html 中订阅异步管道:

    <div>{{ (mySumObservable$ | async) }}</div>
    

    【讨论】:

    • 嗨,谢谢你的好意回复,我理解你的灵魂,我认为这是最好的,但是在箭头(sum + session)给我一个错误之后我遇到了reduce方法的问题,因为sum 是一个数字, session 是一个类型 IPatient (我的界面)。消息说 Operator '+' can't be applied to types 'number' and {orders: number, date: any, assistant?: string} ,我认为问题在于没有采用订单的数值。有什么办法可以解决这个问题?我试过 (sum + session['order']) 但没有运气
    【解决方案2】:

    感谢用户 SnorreDan,我想出了这个解决方案,它对我有用,尽管我不知道这是最好的方法还是最佳实践。然后我按照 SnorreDan 的建议订阅 HTML {{mySumObservable$}}

    let sum = 0;
        this.mySumObservable$ = this.fbservice.getOnePatient(idPatient).pipe(
          map((patient) => {
            patient.sessions.forEach((patient) => {
              sum = sum + patient.orders;
            });
            
            return sum;
          })
        ) as any;

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2021-09-03
      • 1970-01-01
      • 2016-09-05
      • 2021-10-09
      • 1970-01-01
      • 2021-08-09
      • 2020-12-27
      • 2018-12-15
      相关资源
      最近更新 更多