如何仅从特定父集合查询特定ID的子集合?

时间:2020-02-06 12:36:58

标签: firebase google-cloud-firestore

我有一个名为questsquizzes的集合,它们在名为published的文档中包含子集合,这些子集合将包含相应文档的不同发布版本。

  • 任务/
    • 已发布/
  • 测验/
    • 已发布/

questsquizzes也被标记,并且这些标记被复制到已发布的文档中。因此,所有已发布的文档都有一个tags字段(字符串数组)。

我想查询所有与给定标签相关的已发布任务。

db
  .collectionGroup('published')
  // This query is not correct, regex syntax doesn't work here for path.
  // I have added it to show that I want to query only the published 
  // documents inside quests.
  .where(
    firebase.firestore.FieldPath.documentId(),
    '==',
    '/quests/*/published/*'
  )
  .where(
    'tags',
    'array-contains',
    'kinematics'
  )

-编辑--

这是quests的结构,并且quizzes也具有相同的结构。 并且还具有标签字段。

  • 发布1.0版时的问题 db structure of quests: version 1

  • 发布2.0版时的问题 enter image description here

我想获取所有与某个特定标签相关的已发布任务,因此如果我使用“ physics”标签进行查询,则quests // published / 2.0应该是结果文档之一,因为1.0版本与之无关仅用于“运动学”。仅添加一项任务的屏幕截图已添加到此处。有多个任务,其中包含多个与我要查询的标签相关的发行版本。我想通过一个查询来获取所有文件,从测验/ / published / 中排除文档。

1 个答案:

答案 0 :(得分:1)

这部分查询是不可能的:

  .where(
    firebase.firestore.FieldPath.documentId(),
    '==',
    '/quests/*/published/*'
  )

FieldPath.documentId()不能用作集合组查询中的过滤器。这是一个已知的限制。 Firestore中也根本没有通配符匹配。

“从测验//已发布/中排除文档”的要求还有另一个问题。 Firestore查询也不能基于不平等排除特定项目。请阅读此other issue了解更多详情。您可以要做的是将顶级集合的名称(例如“任务”)存储在子集合的文档中的某个字段中,然后进行过滤以使其与该字段匹配。但是您不能以这种方式排除文档。如果要排除,则需要一个表示此排除的布尔字段,例如“ is_not_quiz”,并为每个非测验的文档适当地设置它。