Enhance load_json_to_mongodb function to support change detection and statistics tracking for inserted and updated documents.

This commit is contained in:
2026-02-05 10:37:17 -05:00
parent df89aad7e6
commit 332ad8e5d8
+55 -6
View File
@@ -72,24 +72,30 @@ def find_file_in_multiple_dirs(filename, directories):
return directories_found return directories_found
def load_json_to_mongodb(mongo_updater, directories, update_list, lprint): def load_json_to_mongodb(mongo_updater, directories, update_list, lprint, track_changes=True):
""" """
Load downloaded JSON files into MongoDB collections. Load downloaded JSON files into MongoDB collections with change detection.
Processes series, episodes, cast, and crew data from cached JSON files Processes series, episodes, cast, and crew data from cached JSON files
and inserts them into the appropriate MongoDB collections. and inserts or updates them in the appropriate MongoDB collections.
Automatically detects if documents are new, updated, or unchanged.
Args: Args:
mongo_updater: dbmongo instance for MongoDB operations mongo_updater: dbmongo instance for MongoDB operations
directories: dict containing cache directory paths for different data types directories: dict containing cache directory paths for different data types
update_list: list of series IDs to process update_list: list of series IDs to process
lprint: logger instance for logging operations lprint: logger instance for logging operations
track_changes: bool, if True tracks inserted vs updated documents (default: True)
Returns: Returns:
tuple: (successful_count, failed_count) for series processed tuple: (successful_count, failed_count, stats_dict) for series processed
stats_dict contains: {'inserted': count, 'updated': count}
""" """
successful_count = 0 successful_count = 0
failed_count = 0 failed_count = 0
stats = {'series_inserted': 0, 'series_updated': 0, 'episodes_inserted': 0,
'episodes_updated': 0, 'cast_inserted': 0, 'cast_updated': 0,
'crew_inserted': 0, 'crew_updated': 0}
lprint.logprint("info", f"Starting to load {len(update_list)} series into MongoDB") lprint.logprint("info", f"Starting to load {len(update_list)} series into MongoDB")
@@ -104,8 +110,21 @@ def load_json_to_mongodb(mongo_updater, directories, update_list, lprint):
# Insert or update series in MongoDB # Insert or update series in MongoDB
if series_data: if series_data:
if track_changes:
existing = mongo_updater.mgseries.find_one({"id": series_data.get("id")})
if existing:
# Check if data has changed
if existing.get("updated") != series_data.get("updated"):
stats['series_updated'] += 1
lprint.logprint("debug", f"Updated series data for ID {seriesid}")
else:
lprint.logprint("debug", f"Series {seriesid} unchanged, skipping")
pass # Document unchanged
else:
stats['series_inserted'] += 1
lprint.logprint("debug", f"Inserted new series data for ID {seriesid}")
mongo_updater.bulk_upsert_by_id(mongo_updater.mgseries, [series_data]) mongo_updater.bulk_upsert_by_id(mongo_updater.mgseries, [series_data])
lprint.logprint("debug", f"Loaded series data for ID {seriesid}")
except Exception as e: except Exception as e:
lprint.logprint("warning", f"Failed to load series file for {seriesid}: {e}") lprint.logprint("warning", f"Failed to load series file for {seriesid}: {e}")
failed_count += 1 failed_count += 1
@@ -122,6 +141,17 @@ def load_json_to_mongodb(mongo_updater, directories, update_list, lprint):
# Add seriesid to each episode # Add seriesid to each episode
for episode in episodes_data: for episode in episodes_data:
episode['seriesid'] = seriesid episode['seriesid'] = seriesid
if track_changes:
for episode in episodes_data:
existing = mongo_updater.mgepisodes.find_one({"id": episode.get("id")})
if existing:
if existing.get("updated") != episode.get("updated"):
stats['episodes_updated'] += 1
# else: unchanged
else:
stats['episodes_inserted'] += 1
mongo_updater.bulk_upsert_by_id(mongo_updater.mgepisodes, episodes_data) mongo_updater.bulk_upsert_by_id(mongo_updater.mgepisodes, episodes_data)
lprint.logprint("debug", f"Loaded {len(episodes_data)} episodes for series {seriesid}") lprint.logprint("debug", f"Loaded {len(episodes_data)} episodes for series {seriesid}")
except Exception as e: except Exception as e:
@@ -145,6 +175,15 @@ def load_json_to_mongodb(mongo_updater, directories, update_list, lprint):
item['character']['seriesid'] = seriesid item['character']['seriesid'] = seriesid
characters.append(item['character']) characters.append(item['character'])
if track_changes:
for actor in actors:
existing = mongo_updater.mgactors.find_one({"id": actor.get("id")})
if existing:
if existing.get("updated") != actor.get("updated"):
stats['cast_updated'] += 1
else:
stats['cast_inserted'] += 1
if actors: if actors:
mongo_updater.bulk_upsert_by_id(mongo_updater.mgactors, actors) mongo_updater.bulk_upsert_by_id(mongo_updater.mgactors, actors)
if characters: if characters:
@@ -168,6 +207,15 @@ def load_json_to_mongodb(mongo_updater, directories, update_list, lprint):
item['person']['crew_type'] = item.get('type', 'unknown') item['person']['crew_type'] = item.get('type', 'unknown')
crew_list.append(item['person']) crew_list.append(item['person'])
if track_changes:
for crew in crew_list:
existing = mongo_updater.mgcrew.find_one({"id": crew.get("id")})
if existing:
if existing.get("updated") != crew.get("updated"):
stats['crew_updated'] += 1
else:
stats['crew_inserted'] += 1
if crew_list: if crew_list:
mongo_updater.bulk_upsert_by_id(mongo_updater.mgcrew, crew_list) mongo_updater.bulk_upsert_by_id(mongo_updater.mgcrew, crew_list)
lprint.logprint("debug", f"Loaded crew data for series {seriesid}") lprint.logprint("debug", f"Loaded crew data for series {seriesid}")
@@ -182,7 +230,8 @@ def load_json_to_mongodb(mongo_updater, directories, update_list, lprint):
lprint.logprint("error", f"Unexpected error processing series {seriesid}: {e}") lprint.logprint("error", f"Unexpected error processing series {seriesid}: {e}")
lprint.logprint("info", f"MongoDB loading complete. Successful: {successful_count}, Failed: {failed_count}") lprint.logprint("info", f"MongoDB loading complete. Successful: {successful_count}, Failed: {failed_count}")
return successful_count, failed_count lprint.logprint("info", f"Change statistics: {stats}")
return successful_count, failed_count, stats
def main() -> int: def main() -> int:
ROOTDIR = os.getcwd() ROOTDIR = os.getcwd()