Firestore能否在同一查询的不同字段同时使用array-contains和array-contains-any?
关于Firestore复合查询的可行性解答
这个方案完全可行,不过有几个细节需要你留意一下:
查询逻辑的有效性:当你把
status字段从单个字符串改为单元素数组后,使用where("status", "array-contains-any", ["published", "canceled"])确实能精准匹配那些status数组包含published或canceled的文档。同时结合invitation字段的array-contains条件,Firestore支持这种复合查询组合,能一次性获取你需要的两类事件。复合索引的要求:因为你同时使用了
array-contains和array-contains-any两个条件,Firestore需要对应的复合索引才能执行这个查询。不过不用担心,第一次运行这个查询时,Firestore会在控制台输出一个包含索引创建链接的错误提示,点击链接就能自动生成所需的索引,操作非常简单。数据迁移与写入规范:
- 要确保现有所有
events文档的status字段都从单个字符串更新为单元素数组(比如把"published"改成["published"]),否则旧文档会被排除在查询结果之外。 - 后续写入新文档或更新
status时,要严格保证它始终是单元素数组,避免出现多元素的情况(如果你的业务逻辑不需要多状态的话),防止查询结果出现不符合预期的情况。
- 要确保现有所有
这里给你一个JavaScript环境下的查询示例:
// 简化后的查询代码 db.collection("events") .where("invitation", "array-contains", currentUserUID) .where("status", "array-contains-any", ["published", "canceled"]) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); // 处理每个符合条件的事件文档 }); }) .catch((error) => { console.error("Error getting documents: ", error); });
内容的提问来源于stack exchange,提问作者saul hernandez
相关产品推荐
相关产品推荐

