Cloud Firestore嵌套映射数组查询可行性及数据重构必要性咨询
结论
你当前的文档结构无法原生实现需求中的查询,必须做小幅度的结构重构。
原因说明
Firestore对嵌套数组对象的查询有明确限制:
array-contains查询只能匹配数组内的完整对象,无法单独筛选数组元素的单个字段值,你无法直接查询categories数组中是否存在id = xyz的元素。- Firestore不支持嵌套数组的层级查询,无法直接检索
categories下子对象的allNames数组内的元素。 - 即便两个单独条件可实现,Firestore的
or逻辑运算符也不支持跨这两类嵌套数组条件做组合查询。
重构方案
给每个文档新增两个扁平化的查询专用数组字段即可:
categoryIds:存储所有categories对象的id值,示例doc1的该字段值为["abcd", "xyz"],doc2的该字段值为["abcd3", "xyz"]allCategoryNames:合并所有categories对象下的allNames数组为一个扁平数组,示例doc1的该字段值为["name1", "name2", "name3", "name4", "name5"],doc2的该字段值为["name7", "name4", "name5"]
查询代码示例(JS SDK)
import { collection, query, or, where, getDocs } from "firebase/firestore"; import { db } from "./你的firebase初始化文件路径"; const targetQuery = query( collection(db, "你的集合名称"), or( where("categoryIds", "array-contains", "xyz"), where("allCategoryNames", "array-contains", "name1") ) ); // 执行查询 const querySnapshot = await getDocs(targetQuery); querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); });
上述查询会返回你需求中的doc1和doc2两个文档。
内容的提问来源于stack exchange,提问作者sharath
相关产品推荐
相关产品推荐

