如何在Firestore中结合动态列表使用where()查询?
问题:Firestore如何查询字段值在动态列表中的文档?
我正在使用React Native和Firebase开发应用,希望从Firestore集合中获取字段值存在于某动态列表(列表内容未知)中的文档。期望实现的代码逻辑如下:
const list = ['first', 'second', 'third'] firebase.firestore() .collection('collection') .where(/*where field value is existing inside the list*/) .orderBy('creation', 'desc') .get() .then((res) => { const x = res.docs.map((value) => { const id = value.id; const data = value.data(); return { id, ...data} }) resolve(x) })
最终需返回字段值为'first'、'second'或'third'的文档列表。我尝试了以下代码,但仅返回匹配列表首个元素的文档:
const list = ['first', 'second', 'third'] firebase.firestore() .collection('collection') .where('field', '==', ...list) .orderBy('creation', 'desc') .get() .then((res) => { const x= res.docs.map((value) => { const id = value.id; const data = value.data(); return { id, ...data} }) resolve(x) })
请问该如何正确实现需求?
解决方案
你需要使用Firestore的in查询操作符,它允许匹配字段值存在于指定数组中的文档。之前用==操作符只能匹配单个值,扩展运算符...list在这里只会传入数组的第一个元素,所以只能拿到匹配首个元素的结果。
正确代码示例:
const list = ['first', 'second', 'third'] firebase.firestore() .collection('collection') .where('field', 'in', list) // 替换为in操作符匹配数组 .orderBy('creation', 'desc') .get() .then((res) => { const x = res.docs.map((value) => { const id = value.id; const data = value.data(); return { id, ...data }; }); resolve(x); }) .catch((err) => { // 建议添加错误处理逻辑 reject(err); });
关键注意事项:
- Firestore的
in操作符最多支持数组包含10个元素,如果你的动态列表长度可能超过10,需要将数组拆分成多个长度≤10的子数组,分别发起查询后合并结果。 - 确保集合中
field字段的类型与列表元素类型一致(比如均为字符串),否则会匹配失败。
内容的提问来源于stack exchange,提问作者Sandro Tola
相关产品推荐
相关产品推荐

