为何Firestore的.whereEqualTo方法不生效?两种查询写法疑问
为什么Firestore链式查询生效,分开调用却不行?
这背后的核心原因是:Firestore的Query对象是不可变的。
让我拆解两种写法的区别:
1. 链式调用能正常工作的原因
当你写:
Query firstQuery1 = firebaseFirestore.collection("Test").whereEqualTo("test", "1");
collection("Test")会返回一个基础的Query实例,指向Test集合。- 紧接着调用的
whereEqualTo("test", "1")不会修改原有的Query实例,而是创建并返回一个包含过滤条件的新Query实例。 - 你把这个带条件的新实例赋值给了
firstQuery1,所以后续用这个变量执行查询时,自然会应用过滤规则。
2. 分开调用失效的原因
而当你分开写:
Query firstQuery1 = firebaseFirestore.collection("Test"); firstQuery1.whereEqualTo("test", "1");
- 第一行得到的是不带任何过滤条件的基础Query,赋值给了
firstQuery1。 - 第二行调用
whereEqualTo时,同样会生成带过滤条件的新Query,但你没有把这个新实例重新赋值给firstQuery1。 - 此时
firstQuery1仍然是最初的那个基础Query,没有任何过滤规则,所以查询自然不会生效。
修正方法
只需要把whereEqualTo返回的新Query重新赋值给变量即可:
Query firstQuery1 = firebaseFirestore.collection("Test"); // 关键:将新生成的带条件Query赋值回变量 firstQuery1 = firstQuery1.whereEqualTo("test", "1");
额外说明
Firestore设计不可变的Query对象是有好处的:你可以安全地复用同一个基础Query,在不同场景下添加不同的过滤条件,而不用担心修改了原Query会影响其他地方的使用。比如:
Query baseQuery = firebaseFirestore.collection("Test"); // 场景1:查询test=1的文档 Query query1 = baseQuery.whereEqualTo("test", "1"); // 场景2:查询test=2的文档,baseQuery不受影响 Query query2 = baseQuery.whereEqualTo("test", "2");
内容的提问来源于stack exchange,提问作者Zhenya Ivanov
相关产品推荐
相关产品推荐

