【发布时间】:2019-10-25 22:04:48
【问题描述】:
我正在努力寻找有关使用 Firebase Firestore 过滤数据的最佳做法的好材料。我想根据用户选择的类别过滤我的数据。我有一个存储在我的 firestore 数据库中的文档集合,每个文档都有一个数组,其中包含该单个文档的所有适当类别。为了过滤,我还保留了一个包含用户首选类别的本地数组。我要做的就是根据用户的首选类别过滤数据。
考虑我将用户的首选类别存储为字符串数组( ["Film", "Music"] )。我正计划使用 firestore 的 'array-contains' 方法,例如
db.collection(collectioname)
.where('categoriesArray', 'array-contains', ["Film", "Music"])
后来我发现我不能对数组本身使用'array-contains',在调查了这个问题之后,我决定改变我提到的here的数据结构。
一旦我将类别从数组更改为映射,我想我可以使用多个 where 条件来过滤文档
let query = db.collection(collectionName)
.where(somefield, '==', true)
this.props.data.filterCategories.forEach((val) => {
query = query.where(`categories.${val}`, '==', true);
});
query = query
.orderBy(someOtherField, "desc")
.limit(itemsPerPage)
const snapshot = await query.get()
现在问题 2,firebase 需要为复合查询添加索引。我在每个文档中保存的类别是动态的,我无法提前添加这些索引。在这种情况下,理想的解决方案是什么?任何帮助将不胜感激。
【问题讨论】:
-
你说不能高级索引是什么意思?
-
在我的用例中,每个文档中的类别字段是不同的,或者我不能简单地预先定义这些类别的主集。创建新文档后,用户将能够从类别列表中选择适合当前上下文的类别。此列表来自另一个集合,例如类别,并且此集合中的文档每次都可能不同。表示新类别可能会添加到此集合中,或者现有类别可能会被删除。在这种情况下,我将无法跟上整个索引的步伐。
-
你是说 Firestore 拒绝查询?你能更具体一点吗?尝试在没有任何循环的情况下编写查询(您当前的 forEach 循环看起来不起作用 - 它实际上并没有正确构建查询对象)。
-
这是 OR 查询还是 AND 查询?您是要获取类别为音乐或电影的文档,还是获取类别包括音乐和电影的文档?而且,是的,复合索引限制是一个真正的障碍,但如果您正确地对数据进行非规范化,则不应成为障碍。
-
@bsod 我正在寻找类别包括音乐或电影或两者兼有的所有文档,以及其他一些过滤条件和对我的数据进行分页的设置。您能否指导我更详细地了解如何克服这种限制?
标签: javascript firebase google-cloud-firestore