【问题标题】:How to perform dynamic where queries with firestore and add indexes如何使用 firestore 执行动态 where 查询并添加索引
【发布时间】:2018-01-22 17:05:27
【问题描述】:

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

当有人完成测试时,我还将他们的 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要求我添加索引,当我按照生成的链接添加索引时,我得到了这个

指向completed.CurrentUserId.status。我相信这仅适用于当前用户。

我有几个问题

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

2) 如果是,我该如何索引它?

3) 有什么方法可以根据子集合值查询顶级集合? (这是我真正想要的)

任何帮助表示赞赏。

【问题讨论】:

  • 我只能回答数字 3,我知道这在 atm 是不可能的。我对另外两个也很好奇。
  • @DarkNeuron 这对我来说是一个糟糕的数据库模式。我将整个完成的对象作为一个集合移动到users/uid/tests/tesId,因此当用户完成测试时,它将在他的目录下找到。
  • 也许您可以使用 GraphQL 查询来实现这一点?

标签: javascript firebase angularfire2 google-cloud-firestore


【解决方案1】:

您可以改为使用一组对象(每个对象代表一个参加者)来跟踪所有已完成的参加者。数组在 firestore 中被索引。

数组的数据结构是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多