"""文档文件 (document_file) 业务层 — MongoDB 版本 upsert 策略:(doc_id, file_type) 唯一索引 → update_one / insert_one """ from pymongo.errors import DuplicateKeyError from db import get_collection, COL_FILE, next_id, DocumentFile from db.models import _now def upsert_file(doc_id: str, file_type: str, object_key: str, object_bucket: str, size: int = 0, checksum: str | None = None, url: str | None = None, meta: dict | None = None) -> dict: """插入或更新 (doc_id, file_type) 唯一键""" col = get_collection(COL_FILE) filt = {'doc_id': doc_id, 'file_type': file_type} upd = {'$set': { 'object_key': object_key, 'object_bucket': object_bucket, 'size': size, 'checksum': checksum, 'url': url, 'meta': meta, }} r = col.update_one(filt, upd) if r.matched_count > 0: f = col.find_one(filt) return {'id': f['_id'], 'updated': True} f = DocumentFile( id=next_id('file_id'), doc_id=doc_id, file_type=file_type, object_key=object_key, object_bucket=object_bucket, size=size, checksum=checksum, url=url, meta=meta, ) try: col.insert_one(f.to_mongo()) except DuplicateKeyError: # 极小概率竞争,重试 f2 = col.find_one(filt) col.update_one(filt, upd) return {'id': f2['_id'], 'updated': True} return {'id': f.id, 'updated': False} def get_files(doc_id: str) -> list[dict]: col = get_collection(COL_FILE) return [DocumentFile.from_mongo(d).to_dict() for d in col.find({'doc_id': doc_id})] def get_file_by_type(doc_id: str, file_type: str) -> dict | None: col = get_collection(COL_FILE) d = col.find_one({'doc_id': doc_id, 'file_type': file_type}) return DocumentFile.from_mongo(d).to_dict() if d else None