Firestore使用where in查询文档ID时返回结果的顺序问题
问题解答
核心结论
- 使用
where(FieldPath.documentId(), "in", [...])查询时,返回结果的顺序不会和你传入的ID数组顺序一致。Firestore默认会按文档ID的字典序(升序)返回结果,和输入数组的顺序无关。
官方文档说明
Firestore官方文档明确指出:使用in操作符进行查询时,查询结果不会保留输入值的顺序,默认排序规则为文档ID升序(如果未指定其他orderBy规则)。
解决方法:手动按原ID数组排序
如果你需要结果和输入ID数组的顺序一致,可以在拿到查询结果后,自己根据原ID数组重新排序。示例代码如下:
const targetIds = ["51","32","23","41"]; await myClinics .where(FieldPath.documentId(), "in", targetIds) .get() .then((snapshots) => { // 将快照转为包含id和数据的数组 const docsArray = snapshots.docs.map(doc => ({ id: doc.id, data: doc.data() })); // 按照原ID数组的顺序重新排序 const orderedDocs = targetIds.map(id => docsArray.find(doc => doc.id === id)); // 此时orderedDocs的顺序就和targetIds一致了 orderedDocs.forEach(doc => { if (doc) { // 处理可能不存在的文档(如果ID对应的文档被删除) console.log(`ID: ${doc.id}, 数据:`, doc.data); } }); });
关于文档ID的获取
每条返回的文档快照都可以通过doc.id属性直接获取对应的文档ID,无论顺序如何,你都可以通过这个属性明确每条数据对应的文档ID。
内容的提问来源于stack exchange,提问作者Jaws and Teeth Dental Clinic
相关产品推荐
相关产品推荐

