我有一个名为quests
和quizzes
的集合,它们在名为published
的文档中包含子集合,这些子集合将包含相应文档的不同发布版本。
quests
和quizzes
也被标记,并且这些标记被复制到已发布的文档中。因此,所有已发布的文档都有一个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
也具有相同的结构。
并且还具有标签字段。
我想获取所有与某个特定标签相关的已发布任务,因此如果我使用“ physics”标签进行查询,则quests // published / 2.0应该是结果文档之一,因为1.0版本与之无关仅用于“运动学”。仅添加一项任务的屏幕截图已添加到此处。有多个任务,其中包含多个与我要查询的标签相关的发行版本。我想通过一个查询来获取所有文件,从测验/ / published / 中排除文档。
答案 0 :(得分:1)
这部分查询是不可能的:
.where(
firebase.firestore.FieldPath.documentId(),
'==',
'/quests/*/published/*'
)
FieldPath.documentId()
不能用作集合组查询中的过滤器。这是一个已知的限制。 Firestore中也根本没有通配符匹配。
“从测验//已发布/中排除文档”的要求还有另一个问题。 Firestore查询也不能基于不平等排除特定项目。请阅读此other issue了解更多详情。您可以要做的是将顶级集合的名称(例如“任务”)存储在子集合的文档中的某个字段中,然后进行过滤以使其与该字段匹配。但是您不能以这种方式排除文档。如果要排除,则需要一个表示此排除的布尔字段,例如“ is_not_quiz”,并为每个非测验的文档适当地设置它。