如何在Firebase Firestore中执行IN查询并获取目标文档及内部ID?
在Firebase Firestore中实现类似SQL IN子句的查询
当然可以!在Firebase Firestore里,你完全能实现和SQL语句select * from foo where bar in ('a', 'b', 'c')等价的查询,刚好能帮你通过一组外部ID列表找到对应的文档及其内部ID。
基础用法:使用whereIn()方法
Firestore专门提供了whereIn()方法来处理这种“匹配列表中任意值”的查询需求。下面是一个JavaScript的示例代码:
// 假设你的目标集合是'foo',用来匹配的字段是'bar' const targetExternalIds = ['a', 'b', 'c']; // 执行查询 db.collection('foo') .where('bar', 'in', targetExternalIds) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { // doc.id 就是文档的内部ID,doc.data() 包含文档的所有字段内容 console.log(`找到文档:内部ID = ${doc.id},内容 =`, doc.data()); }); }) .catch((error) => { console.error('查询过程中出现错误:', error); });
需要注意的限制
不过有个小细节要留意:Firestore的whereIn()方法对列表长度有最多10个元素的限制。如果你的外部ID列表长度超过10,直接用一个whereIn()会报错,这时候需要把列表拆分成多个不超过10个元素的子列表,分别执行查询后再合并结果。
比如下面的代码示例,展示如何处理超长ID列表:
const largeExternalIds = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']; // 超过10个元素 // 把大数组拆分成多个最多10个元素的子数组 const chunkedIds = []; for (let i = 0; i < largeExternalIds.length; i += 10) { chunkedIds.push(largeExternalIds.slice(i, i + 10)); } // 并行执行所有子查询,然后合并结果 Promise.all(chunkedIds.map(ids => db.collection('foo').where('bar', 'in', ids).get() )) .then((querySnapshots) => { const allMatchedDocs = []; querySnapshots.forEach((snapshot) => { snapshot.forEach((doc) => { allMatchedDocs.push({ 内部ID: doc.id, ...doc.data() }); }); }); console.log('所有匹配的文档:', allMatchedDocs); }) .catch((error) => { console.error('查询出错:', error); });
索引相关提示
如果只是单字段(比如这里的bar字段)的whereIn查询,Firestore会自动维护对应的索引,你不需要手动在Firebase控制台创建索引。但如果是结合了其他过滤条件的复合查询,可能需要手动创建复合索引才能正常执行。
内容的提问来源于stack exchange,提问作者Johan Nordberg
相关产品推荐
相关产品推荐

