Firebase Firestore - 使用多个“数组包含”过滤数据

nit*_*npp 7 javascript firebase google-cloud-firestore

我正在努力寻找关于使用 firebase firestore 过滤数据的最佳实践的好材料。我想根据用户选择的类别过滤我的数据。我的 firestore 数据库中存储了一组文档,每个文档都有一个数组,其中包含该单个文档的所有适当类别。为了过滤,我还保留了一个包含用户首选类别的本地数组。我想要做的就是根据用户的首选类别过滤数据。

Firestore 类别字段

考虑我将用户的首选类别存储为字符串数组( ["Film", "Music"] )。我计划使用 firestore 的“array-contains”方法,例如

db.collection(collectioname)
.where('categoriesArray', 'array-contains', ["Film", "Music"])

Run Code Online (Sandbox Code Playgroud)

后来我发现我不能对数组本身使用“array-contains”,在调查了这个问题后,我决定改变我的数据结构,如这里提到的。

类别更改为地图

一旦我将类别从数组更改为映射,我想我可以使用多个 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()

Run Code Online (Sandbox Code Playgroud)

现在问题 2,firebase 需要为复合查询添加索引。我在每个文档中保存的类别是动态的,我无法提前添加这些索引。在这种情况下,理想的解决方案是什么?任何帮助将不胜感激。

小智 5

这是 Firebase JavaScript SDK 于 2019 年 11 月 7 日推出的一项新功能:

array-contains-any运算符将同一字段上最多 10 个包含数组的子句与逻辑 OR 组合在一起。数组包含任何查询返回文档,其中给定字段是包含一个或多个比较值的数组”

citiesRef.where('regions', 'array-contains-any',
    ['west_coast', 'east_coast']);
Run Code Online (Sandbox Code Playgroud)