【问题标题】:Query by array item and other fields at once in Firestore在 Firestore 中一次按数组项和其他字段查询
【发布时间】:2018-05-13 16:07:55
【问题描述】:

我不得不重新表述这个问题,因为它有点误导(我的错)。

这是我的困境,假设我有一个聚会收藏:

parties {
  status: "open",
  invitees: [56486,68978,897650], # user ids of invited users
  scheduled_at: 1948089050 # timestamp
}

我只想查询受邀参加的“公开”派对(我在受邀者数组中的用户 ID),并按 scheduled_at 排序

我可以通过将数组转换为哈希来解决查询数组的第一部分(感谢@renaud 和@james poag)

parties {
  status: "open",
  invitees: {
    56486: true,
    68978: true,
    897650: true
  }
  scheduled_at: 1948089050
}

现在执行这个:

db.collection('parties').where('status', '==', 'open').where('invitees.56486', '==', true').orderBy('scheduled_at')

导致 Firebase 错误,要求我为 status + invitees.56486 + scheduled_at 创建复合索引。如您所见,为每个用户 ID 添加索引对我来说是不切实际的。

有什么想法吗?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    您似乎正在尝试针对并不真正支持该查询的架构进行查询。您将不得不调整架构(可能在集合之间复制数据)以支持您的预期查询。这种做法对于 NoSQL 类型的数据库来说是很正常的。

    您将需要一个新集合,将单个派对与单个受邀者相关联,每个组合一个,有效地充当他们之间的“加入”:

    party-invitees
      - party_id
      - party_status ("open")
      - party_scheduled_at
      - attendee_id
    

    现在您可以了解与会者被邀请参加哪些公开派对:

    db.collection('party-invitees')
        .where('party_status', '==', 'open')
        .where('attendee_id', '==', 'whatever')
        .orderBy('party_scheduled_at')
    

    请记住,您必须更改此集合以及具有相同数据的任何其他集合,因为它们已更改。幸运的是,批量写入和事务使这更容易以原子方式完成。

    【讨论】:

    • 谢谢@Doug - 你建议如何实现数据复制?我担心如果我使用触发功能,如果同时完成许多被邀请者切换/竞争条件,信息可能会不同步。
    • 换句话说,我如何保证party-invitees 最终与受邀者数组同步(事实来源)。
    • 无论什么进程正在写入数据,都需要注意它必须在多个地方写入以保持一切同步。这完全取决于您。
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 2022-10-12
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多