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

标签 javascript firebase angularfire2 google-cloud-firestore

在我的网站上,我正在进行类似测试的调查,每个测试都有attendies子集合,看起来像这样

enter image description here

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

这是我尝试过的

    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) 有什么方法可以根据子集合值查询热门集合? (这才是我真正想要的)

感谢任何帮助。

最佳答案

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

数组的数据结构为:

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

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

关于javascript - 如何使用 firestore 执行动态 where 查询并添加索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48386762/

相关文章:

javascript - 输入框的值在 4 个数字后重置

javascript - 尝试通过 html 查找文本并更改 anchor 标记失败

firebase - 是否有任何 Firebase 旧版文档?

求和值时的 Javascript 舍入问题

javascript - for循环中的延迟

javascript - Firebase 的 .once() 查询方法在被调用后不会停止监听

javascript - 无法在 firebase 重定向结果中使用 Redux props

firebase - firebase存储中的下载网址为空

typescript - 从 QuerySnapshot 获取数据

javascript - Firebase 查询子级的子级是否包含值