nit*_*npp 7 javascript firebase google-cloud-firestore
我正在努力寻找关于使用 firebase 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)