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

如何在第三方API数据变更时更新Firestore文档而非创建新文档

解决Firestore重复创建赛事文档的问题

问题根源在于你调用Firestore的document()方法时没有指定固定的文档ID,每次都会生成随机ID,导致同一场赛事被重复创建。API返回的event_id是赛事的唯一标识,正好可以用来作为文档ID,确保同一场赛事只会对应一个文档,更新时直接覆盖或合并原有数据。

修改后的完整代码如下:

import requests
import json
from firebase_admin import firestore

db = firestore.Client(project='xxxx')


def bluebet_nba_odds():
    # API CALL
    link = 'https://xxxxxxxxxx.com.au/json/reply/MasterCategoryRequest?EventTypeID=107&WithLevelledMarkets=true&WithLevelledMarkets=true'
    nbadata = requests.get(link).json()  # 直接用.json()解析,简化步骤

    # JSON PARSE
    for nba_odds in nbadata['MasterCategories'][2]['Categories'][0]['MasterEvents']:
        competition = nba_odds['CategoryName']
        event_id = nba_odds['MasterEventId']
        event_title = nba_odds['MasterEventName']
        start_time = nba_odds['MaxAdvertisedStartTime']
        home_team = nba_odds['Markets'][0]['OutcomeName']
        home_team_win_odds = nba_odds['Markets'][0]['Price']
        away_team = nba_odds['Markets'][1]['OutcomeName']
        away_team_win_odds = nba_odds['Markets'][1]['Price']

        # WRITE TO FIRESTORE
        data = {
            'competition': competition,
            'event_id': event_id,
            'event_title': event_title,
            'start_time': start_time,
            'home_team': home_team,
            'home_team_win_odds': home_team_win_odds,
            'away_team': away_team,
            'away_team_win_odds': away_team_win_odds,
            'timestamp': firestore.SERVER_TIMESTAMP,
        }

        # 关键改动:用event_id作为文档ID,确保同赛事操作同一文档
        # merge=True表示只更新传入的字段,保留原有未修改的字段(可选,按需选择)
        db.collection('bluebet_nba_season_odds').document(event_id).set(data, merge=True)
        print(f'赛事 {event_title} 数据已更新至Firestore')


if __name__ == "__main__":
    bluebet_nba_odds()

关键改动说明:

  • 固定文档ID:将document()改为document(event_id),用API返回的唯一event_id作为文档ID,这样同一场赛事始终对应同一个文档,不会重复创建。
  • 可选合并更新:添加merge=True参数,调用set(data, merge=True)时,只会更新data中包含的字段,不会删除文档中原有的其他字段(如果后续有新增字段需求,这个设置会更灵活)。如果需要完全覆盖文档内容,可以去掉merge=True,直接用set(data)。
  • 简化JSON解析:直接使用requests.get(link).json()代替先转字符串再json.loads(),代码更简洁。
  • 移除冗余全局变量:全局变量在这里没必要,直接在循环内处理变量即可,让代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者DrewS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:02:20