contents 확정후보 필드를 전부 열거하고 판정 기준을 적용한 결과입니다. 판정 열은 제 추천값으로 미리 채워져 있으니 바꿀 것만 바꾸시면 됩니다. 다 고르고 아래 JSON 출력을 누르면 선택 목록이 나옵니다. 선택은 브라우저에 자동 저장되어 새로고침해도 남습니다. · 구조 문서
확정 공용 16 · 개별(data) 9 · 최적화용 3 · 제거 7 · 보류 3 (총 38) 확정된 contents 스키마 { _id ObjectId ● platform enum ● x · tt · ig · yt · rd · gh subtype enum ● tweet · video · photo · post · reel · tv · story · repo · gist · search · intent · shortlink · unknown platform_key string ○ 그 플랫폼 안에서 이 대상을 가리키는 값 source_urls[] object[] ● { url, status, observed_at } creator_id ObjectId ○ accounts venue_id ObjectId ○ venues parent_content_id ObjectId ○ contents (자기 참조) parent_relation enum ○ quote · retweet · fork site_id ObjectId ○ 보류 — 웹 처리 미결 published_at Date ○ observed_at Date ● created_at/updated_at Date ● BaseModel text.primary string ○ 보류 — search·hashtag 도 여기로 text.body string ○ 보류 text.from_media string ○ ig alt · tt transcriptionLink links[] string[] 기본값 [] tags[] string[] 기본값 [] mentions[] object[] 기본값 [] { platform_key, screen_name } — _id 참조 아님 author{} object ○ 최적화용 — 관측 시점 작성자 스냅샷 metrics_latest Mixed ○ 최적화용 — SoT 는 스냅샷 컬렉션 link_stats{} object ○ 최적화용 — SoT 는 token_links data Mixed 기본값 {} 플랫폼 원래 이름 유지 · 네임스페이스 없음 } 제거 7 content_key · source_type · source_key · ext · form · fetch_status · data.productType
질문 1 · 이 필드로 쿼리하는가? (filter · sort · join · group · index) 아니오 → data 예 → 질문 2 질문 2 · 값의 의미가 모든 subtype 에서 같은가? 아니오 → data 예 → 질문 3 질문 3 · 이 값의 원본(SoT)이 다른 곳에 있는가? 예 → 최적화용 아니오 → 공용
이름 규칙
_id 로 끝나면 → 항상 ObjectId — 우리가 발급, 우리 DB 안의 다른 행을 가리킨다
_key 로 끝나면 → 항상 외부 문자열 — 남이 발급, 우리가 만들지 않는다
_id · creator_id · venue_id · parent_content_id · site_id ObjectId
platform_key '2070140594496626759' 그 플랫폼 안에서 이 대상을 가리키는 값
url_key 'foo.com' sites 의 apex 도메인 (contents 는 안 씀)
선행 과제 — classifier 가 서로 다른 대상을 같은 키로 접는다. 어느 필드를 쓰든 잘못된 병합을 만든다.
instagram /stories/{user}/{id} sourceKey = 'stories' 예약어를 핸들로 오인
reddit /r/{sub}/search?q={q} sourceKey = '{sub}' 검색어가 아니라 서브레딧
reddit /r/{sub}/s/{hash} sourceKey = '{sub}' share 링크인데 서브레딧
실측: /stories/druski/3927… 와 /stories/wall/3923… 이 같은 키로 잡힌다.
/r/wsb/search?q=wendys 와 ?q=wendys+dumpster 도 같은 키다.
| subtype | platform_key 에 무엇이 들어가나 | 출처 |
|---|---|---|
tweet | tweet id | 응답 · URL 둘 다 같은 값 |
video · photo (tt) | video id | 응답 · URL 둘 다 같은 값 |
post · reel · tv (ig) | shortcode Bjnx75lFFQp → 결제 후 숫자 pk | URL. 표본 20/20 이 skipped_paid 라 응답 값은 못 얻는 중 |
repo (gh) | owner/name | URL · 응답 |
search | 검색어 'flock camera' | URL. fetch 대상이 아님(unsupported) |
shortlink | 단축 코드 ZSABC123 → 해석 후 video id | URL |
unknown | null 일 수 있음 | — |
기존 행 찾는 순서 — 새 URL 이 들어왔을 때
1. source_urls.url 로 찾는다 이미 본 URL 이면 여기서 끝
2. 없으면 platform_key 로 찾는다 다른 URL 로 같은 대상을 본 경우
3. 그래도 없으면 새 행
IG 처럼 나중에 platform_key 가 shortcode → 숫자 pk 로 바뀌어도 1번이 먼저라 기존 행을 찾는다.
필수 여부
필수 ● 값이 없으면 저장 자체가 안 된다
기본값 필수지만 기본값이 있어 항상 존재한다 (배열 → [], 불리언 → false)
선택 ○ 없을 수 있다
"기본값" 을 따로 두는 이유 — 필드가 항상 존재하면 partial index 를 못 만든다.
partialFilterExpression 은 $ne 도 $size 도 지원하지 않아 "빈 배열 제외" 를 표현할 수 없다.
현행 설계가 idx_accounts_wallet 을 partial 로 못 만든 이유가 정확히 이것이다.
| 필드 | 어디서 오나 · 무엇인가 | Q1 쿼리 |
Q2 의미 |
Q3 원본 |
판정 근거 · 쟁점 | 판정 | 필수 | 메모 |
|---|
아래 내용을 복사해서 채팅에 붙여넣으시면 그대로 문서에 반영하겠습니다.