"""用户画像管理"""
import logging
from apps.common.mongo import MongoDB
from apps.schemas.collection import UserDomainData
logger = logging.getLogger(__name__)
class UserDomainManager:
"""用户画像管理"""
@staticmethod
async def get_user_domain_by_user_sub_and_topk(user_sub: str, topk: int) -> list[str]:
"""根据用户ID,查询用户最常涉及的n个领域"""
mongo = MongoDB()
user_collection = mongo.get_collection("user")
domains = await user_collection.aggregate(
[
{"$project": {"_id": 1, "domains": 1}},
{"$match": {"_id": user_sub}},
{"$unwind": "$domains"},
{"$sort": {"domain_count": -1}},
{"$limit": topk},
],
)
return [UserDomainData.model_validate(domain).name async for domain in domains]
@staticmethod
async def update_user_domain_by_user_sub_and_domain_name(user_sub: str, domain_name: str) -> None:
"""增加特定用户特定领域的频次"""
mongo = MongoDB()
domain_collection = mongo.get_collection("domain")
user_collection = mongo.get_collection("user")
domain = await domain_collection.find_one({"_id": domain_name})
if not domain:
await domain_collection.insert_one({"_id": domain_name, "domain_description": ""})
await user_collection.update_one(
{"_id": user_sub, "domains.name": domain_name}, {"$inc": {"domains.$.count": 1}},
)