You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:35:28