如何在第三方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
相关产品推荐
相关产品推荐

