Skip to content
Merged
17 changes: 6 additions & 11 deletions app/repositories/user_weight_repository.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from typing import List, Dict
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorCollection
from pymongo import UpdateOne

from app.models import db_w2v_mapper
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorCollection


class UserWeightRepository:
Expand All @@ -15,7 +13,6 @@ def update_user_weights(
):
operations = []
for meta_id, name in meta_info:
name = db_w2v_mapper.translate_genre(name)
operations.append(
UpdateOne(
{"user_id": user_id, "meta_info_id": meta_id},
Expand All @@ -36,8 +33,7 @@ async def update_user_weights_from_log(self, log: dict, weight: float):
operations = []

# 1. 장르
for genre in meta_info.get("genres", []):
name = db_w2v_mapper.translate_genre(genre)
for name in meta_info.get("genres", []):
operations.append(
UpdateOne(
{"user_id": user_id, "name": name},
Expand Down Expand Up @@ -86,9 +82,9 @@ async def find_by_user_id(self, user_id: int) -> List[Dict]:
results = await cursor.to_list(length=None)
return results

async def reset_weight(self, user_id: int, genre: str, weight: float):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: reset_weight 메서드가 UserWeightRepository에서 제거되었는데
daily_wieght_resizer.py의 실패 로그 재시도 부분(124줄)에서 사용되고 있습니다! 확인 부탁드립니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

미처 확인하지 못한 부분이네요. 반영 완료했습니다!

filter = {"user_id": user_id, "name": genre}
update = {"$set": {"weight": weight}}
async def update_user_weight(self, user_id: int, meta_info_name: str, diff: float):
filter = {"user_id": user_id, "name": meta_info_name}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 : 한 가지 우려 되는 부분이 있습니다...!
현재 user_id + meta_info_name 조합으로 필터링하고 있는데 meta_info_name 자체가 unique하다는 보장이 없는 것으로 알고있습니다.
동일한 이름을 가진 서로 다른 메타 정보(예 - 감독, 배우 등)가 존재할 수 있기 때문에
해당 조합만으로는 정확한 문서를 식별하지 못해 데이터 무결성이 깨질 수 있는 위험이 있어 보입니다!

이 부분을 보완하기 위해 (user_id, meta_type, meta_info_name)을 기준으로 필터링하는 방식은 어떨까요?

Copy link
Collaborator Author

@likerhythm likerhythm Aug 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 리뷰 감사합니다. meta_type으로 구분하더라도 이름이 같은 배우 등 구분할 수 없는 경우도 있다고 생각해서 meta_info_id로 구분하겠습니다!

update = {"$inc": {"weight": diff}}
await self.collection.update_one(filter, update, upsert=True)

async def decrease_user_weights_from_log(self, log: dict, weight: float):
Expand All @@ -97,8 +93,7 @@ async def decrease_user_weights_from_log(self, log: dict, weight: float):

operations = []

for genre in meta_info.get("genres", []):
name = db_w2v_mapper.translate_genre(genre)
for name in meta_info.get("genres", []):
operations.append(
UpdateOne(
{"user_id": user_id, "name": name},
Expand Down
25 changes: 13 additions & 12 deletions app/services/daily_weight_resizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ async def resize_weight(
weight = weight_strategy.convert_to_weight(action_type, value)
# 가중치 resize
resized_weight = exponential_decay_weight(weight, log['timestamp'])
diff = resized_weight - weight

meta = log.get('metaInfo', {})
genres = meta.get('genres', {})
Expand All @@ -64,38 +65,38 @@ async def resize_weight(
countries = meta.get('country', {})

for _, genre_name in genres.items():
genre_dict[genre_name] += resized_weight
genre_dict[genre_name] += diff
for _, actor_name in actors.items():
actor_dict[actor_name] += resized_weight
actor_dict[actor_name] += diff
for _, director_name in directors.items():
director_dict[director_name] += resized_weight
director_dict[director_name] += diff
for _, country_name in countries.items():
country_dict[country_name] += resized_weight
country_dict[country_name] += diff


# MongoDB에 resized 가중치 저장
for genre_name, resized_weight in genre_dict.items():
for genre_name, diff in genre_dict.items():
try:
await user_weight_repo.reset_weight(user_id, genre_name, resized_weight)
await user_weight_repo.update_user_weight(user_id, genre_name, diff)
except Exception:
failed.append((user_id, genre_name, resize_weight))

await asyncio.sleep(5)
for actor_name, resized_weight in actor_dict.items():
for actor_name, diff in actor_dict.items():
try:
await user_weight_repo.reset_weight(user_id, actor_name, resized_weight)
await user_weight_repo.update_user_weight(user_id, actor_name, diff)
except Exception:
failed.append((user_id, actor_name, resize_weight))

for director_name, resized_weight in director_dict.items():
for director_name, diff in director_dict.items():
try:
await user_weight_repo.reset_weight(user_id, director_name, resized_weight)
await user_weight_repo.update_user_weight(user_id, director_name, diff)
except Exception:
failed.append((user_id, director_name, resize_weight))

for country_name, resized_weight in country_dict.items():
for country_name, diff in country_dict.items():
try:
await user_weight_repo.reset_weight(user_id, country_name, resized_weight)
await user_weight_repo.update_user_weight(user_id, country_name, diff)
except Exception:
failed.append((user_id, country_name, resize_weight))

Expand Down