如何在Firestore中查询含当前日期的programme文档并访问其exercise子集合?
Firestore 查询指定日期会话并获取子集合数据
核心思路
先筛选出programme集合中date字段匹配当前日期的会话文档,再逐个遍历这些文档,通过文档引用获取其下的exercise子集合数据。因为查询返回的是文档快照集合,而非单个文档引用,所以需要遍历处理每个匹配结果。
Web端(Firebase JS SDK v9 模块化)实现
import { collection, query, where, getDocs } from "firebase/firestore"; import { db } from './firebase-config'; // 你的Firestore初始化文件 async function getTodayTrainingData() { // 生成当前日期字符串(格式需与Firestore中date字段完全一致,示例为YYYY-MM-DD) const today = new Date().toISOString().split('T')[0]; // 1. 构建查询:筛选programme集合中date等于今日的文档 const programmeQuery = query( collection(db, 'programme'), where('date', '==', today) ); const sessionSnapshots = await getDocs(programmeQuery); // 2. 遍历匹配的会话文档,获取对应的exercise子集合 const todayTrainingData = []; for (const sessionDoc of sessionSnapshots.docs) { // 通过文档引用获取exercise子集合 const exerciseSnapshots = await getDocs( collection(sessionDoc.ref, 'exercise') ); // 格式化子集合数据 const exercises = exerciseSnapshots.docs.map(exDoc => ({ id: exDoc.id, reps: exDoc.data().reps, weights: exDoc.data().weights })); todayTrainingData.push({ sessionId: sessionDoc.id, sessionDate: sessionDoc.data().date, exercises: exercises }); } return todayTrainingData; } // 调用并打印结果 getTodayTrainingData() .then(data => console.log('今日训练数据:', data)) .catch(err => console.error('数据获取失败:', err));
注意事项
- 如果Firestore中
date字段存储的是Timestamp类型,需调整查询条件为匹配当天的时间范围:const startOfDay = new Date(); startOfDay.setHours(0, 0, 0, 0); const endOfDay = new Date(); endOfDay.setHours(23, 59, 59, 999); const programmeQuery = query( collection(db, 'programme'), where('date', '>=', startOfDay), where('date', '<=', endOfDay) );
Python端实现
import firebase_admin from firebase_admin import firestore from datetime import datetime, timezone # 初始化Firebase(首次运行需配置服务账号密钥) if not firebase_admin._apps: cred = firebase_admin.credentials.Certificate('serviceAccountKey.json') firebase_admin.initialize_app(cred) db = firestore.client() def get_today_training_data(): # 获取当前UTC日期(需与Firestore中date字段时区一致) today = datetime.now(timezone.utc).date() # 查询programme集合中date匹配今日的文档 session_docs = db.collection('programme').where('date', '==', today).stream() today_data = [] for session_doc in session_docs: # 获取当前会话的exercise子集合 exercise_docs = session_doc.reference.collection('exercise').stream() exercises = [] for ex_doc in exercise_docs: ex_data = ex_doc.to_dict() exercises.append({ 'exercise_name': ex_doc.id, 'reps': ex_data['reps'], 'weights': ex_data['weights'] }) today_data.append({ 'session_id': session_doc.id, 'session_date': session_doc.to_dict()['date'], 'exercises': exercises }) return today_data # 调用并输出结果 print('今日训练数据:', get_today_training_data())
内容的提问来源于stack exchange,提问作者Brady
相关产品推荐
相关产品推荐

