React Native Firebase:如何查询非当日未完成任务及当日全部任务?
Firebase 任务列表复合查询实现方案
你的需求是查询两类任务:
- 非当日创建的未完成任务(
createAt早于当日起始时间,且isDone为false) - 当日创建的所有任务(
createAt在当日时间范围内,无论isDone状态)
在Firebase Firestore中,无法通过单次查询直接实现这个需求,原因如下:
Firestore的查询基于链式"与"逻辑,且单个查询仅支持一个范围条件(比如<、>=这类针对日期/数值的范围判断)。而你的需求本质是两个互斥"与条件组"的"或"逻辑:
- 条件组1:
createAt < 当日起始时间ANDisDone == false - 条件组2:
当日起始时间 <= createAt < 次日起始时间AND 无isDone限制
Firestore不支持跨条件组的OR查询,因此必须分两次查询,再在客户端合并结果。
具体实现步骤
计算当日时间边界
先算出当日的起始时间戳(如2024-05-20 00:00:00)和次日起始时间戳(2024-05-21 00:00:00),可通过原生Date对象或日期工具库处理:// 原生JS示例:计算当日起始与结束时间 const today = new Date(); const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()); const endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000);发起两个查询
分别针对两个条件组发起查询:const db = firebase.firestore(); // 查询非当日未完成任务 const query1 = db.collection('tasks') .where('createAt', '<', startOfDay) .where('isDone', '==', false); // 查询当日所有任务 const query2 = db.collection('tasks') .where('createAt', '>=', startOfDay) .where('createAt', '<', endOfDay);合并查询结果
用Promise.all同时获取两个查询快照,再合并文档数据:Promise.all([query1.get(), query2.get()]) .then(([snapshot1, snapshot2]) => { const tasks = []; snapshot1.forEach(doc => tasks.push({ id: doc.id, ...doc.data() })); snapshot2.forEach(doc => tasks.push({ id: doc.id, ...doc.data() })); // 按需排序(例:按createAt降序) tasks.sort((a, b) => b.createAt - a.createAt); console.log('合并后的任务列表', tasks); }) .catch(err => console.error('查询失败', err));
注意事项
- 需要为查询创建对应复合索引:
- 第一个查询需创建
createAt(升/降序) +isDone(升/降序)的复合索引 - 第二个查询单独的
createAt索引即可满足,复合索引也兼容
首次运行查询时,Firebase控制台会提示创建缺失索引,点击提示链接即可完成操作。
- 第一个查询需创建
内容的提问来源于stack exchange,提问作者Lasharela
相关产品推荐
相关产品推荐

