如何使用firestore执行动态查询并添加索引

时间:2018-01-22 17:05:27

标签: javascript firebase angularfire2 google-cloud-firestore

在我的网站中,我正在进行类似tests的调查,每个测试都有attendies子集合,如下所示

enter image description here

当有人完成测试时,我也会将uid添加到completed字段,就像我在框中绘制的那样。现在,我想根据tests查询status == completed

这是我试过的

    this.completedModulesRef$ = this.afs.collection('tests', ref => 
           ref.orderBy('moduleNum', 'desc')
              .where('completed.'+auth.uid+'.status','==','completed'));

    this.completedModules$ = this.completedModulesRef$.valueChanges();

然后firestore要我添加索引,当我按照生成的链接添加索引时我得到了这个

enter image description here 它指向completed.CurrentUserId.status。我相信这只适用于当前用户。

我有几个问题

1).where('completed.'+auth.uid+'.status','==','completed')这是一个有效的查询吗?

2)如果是,我怎么能索引它?

3)根据子集合值查询顶级集合的任何方法? (这就是我真正想要的)

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

您可以改为使用一组对象(每个对象代表一个与会者)来跟踪所有已完成的与会者。数组在Firestore中建立索引。

该数组的数据结构为:

compeleted: [{}] = [
  {id: string, points: number, status: string}
]

根据要获取数据的方式和位置,这可能不是最理想的数据库模型,但是它将被索引并且可以查询它。我会考虑将积分和状态存储在与会者的子集合中。看看firestore中的分组集合查询-一种新功能,您可以一次在所有出席者子集合中查询-如果要获取一个参加者完成的所有测试,则具有特定ID且状态为完成的任何参加者。