我真的很难使用 Firestore 作为我的后端。由于每一个数据库设计,我都尝试以 Firebase 结束,不允许我需要的几乎任何子查询或嵌套过滤组合。
域很简单我有包含类别和语言的类(class),我想按类别和语言过滤这些类(class)。
到目前为止我已经尝试过:
集合:
[
courses,
categories,
languages,
]
文档示例:
类(class)
{
id: 'pQYYsU80iLgZqTiYLkJXwHL25873',
title: 'Javascript II',
teacherName: 'Bob',
categories: ['javascript','nodejs'],
languages: ['english','spanish']
}
类别
{
id: 'QJMzrwEJ6vRtPBsfSOVxojTMuHk1',
name: 'programming',
subcategories: ['programming','javascript','php','nodejs'],
keywords: ['computer', 'developing', 'web', 'developer', 'programming','javascript','php','nodejs']
}
语言
{
id: 'AbMzrwC6vRRPBsfSOVx2jTMuHk1',
name: 'english',
code: 'en-US',
}
我想查询,即:所有关于'javascript'
且以'english'
提供的类(class)。但不可能在单个查询中获取它们,因为 array-contains
不能嵌套多次。
我无法通过获取多个查询来完成此操作,因为设备很快就会耗尽内存。
是否有任何域设计替代方案可以在单个查询中实现此目的?
最佳答案
But it is impossible to fetch them in a single query as array-contains cannot be nested multiple times.
是的,您只能使用一次array-contains
。如果允许更改文档结构,则可以通过将数组数据类型更改为 Map 来解决此问题,如下所示:
{
id: 'pQYYsU80iLgZqTiYLkJXwHL25873',
title: 'Javascript II',
teacherName: 'Bob',
categories: {
javascript = true,
nodejs = true
},
languages: {
english = true,
spanish = true
}
}
I want to query, i.e.: all the courses about 'javascript' and available in 'english'.
使用上面的架构,执行以下查询:
coursesRef
.where("categories.javascript", "==", true)
.where("languages.english", "==", true);
它将完美地工作。
关于此模型的 Firebase 替代数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68995386/