Firestore非等于查询问题:如何获取非本人所属的任务
我太懂这种找不到满意答案的烦躁了!Firestore一开始确实不支持!=运算符,但现在有几种靠谱的方法能实现你要的「查询非本人所属任务」的需求,我给你一步步讲清楚:
方案1:用Firestore原生的
!=运算符(最推荐) Firestore后来更新了对!=和not-in的支持,这是最直接高效的方式,你的代码可以改成这样:
export default function fetchTasks () { return async (dispatch) => { // 先拿到当前用户的UID,这里替换成你实际获取用户UID的逻辑 const currentUserUid = "当前用户的UID"; const tasksQuery = db.collection('tasks') .where('owner', '!=', currentUserUid); const snapshot = await tasksQuery.get(); // 把查询结果转成你需要的格式 const tasks = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); // 这里dispatch你的action更新状态 dispatch({ type: 'FETCH_TASKS_SUCCESS', payload: tasks }); } }
小提醒:第一次运行如果提示索引缺失,直接跟着Firestore给出的链接创建对应的索引就行,非常方便。
方案2:客户端过滤(适合小数据量场景)
如果你的任务集合数据量不大(比如几百条以内),可以先拉取所有任务,再在客户端过滤掉当前用户的任务:
export default function fetchTasks () { return async (dispatch) => { const currentUserUid = "当前用户的UID"; const snapshot = await db.collection('tasks').get(); const tasks = snapshot.docs .map(doc => ({ id: doc.id, ...doc.data() })) // 过滤掉当前用户创建的任务 .filter(task => task.owner !== currentUserUid); dispatch({ type: 'FETCH_TASKS_SUCCESS', payload: tasks }); } }
这种方式的好处是不用操心索引,但缺点是会拉取所有数据,带宽消耗大,所以只适合数据量小的场景。
方案3:合并两个范围查询(旧版本兼容备选)
在Firestore还没支持!=的时候,大家常用这个技巧:用两个范围查询(owner小于当前UID + owner大于当前UID),然后合并结果:
export default function fetchTasks () { return async (dispatch) => { const currentUserUid = "当前用户的UID"; // 两个并行查询 const queryLess = db.collection('tasks').where('owner', '<', currentUserUid); const queryGreater = db.collection('tasks').where('owner', '>', currentUserUid); const [snapshotLess, snapshotGreater] = await Promise.all([queryLess.get(), queryGreater.get()]); // 合并两个查询的结果 const tasksLess = snapshotLess.docs.map(doc => ({ id: doc.id, ...doc.data() })); const tasksGreater = snapshotGreater.docs.map(doc => ({ id: doc.id, ...doc.data() })); const tasks = [...tasksLess, ...tasksGreater]; dispatch({ type: 'FETCH_TASKS_SUCCESS', payload: tasks }); } }
这个方案利用了字符串字典序的比较逻辑,不过现在有了原生!=,这个方法更多是作为兼容旧版本的备选了。
内容的提问来源于stack exchange,提问作者nrion
相关产品推荐
相关产品推荐

