필드 판정 — 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 도 같은 키다.
subtypeplatform_key 에 무엇이 들어가나출처
tweettweet id응답 · URL 둘 다 같은 값
video · photo (tt)video id응답 · URL 둘 다 같은 값
post · reel · tv (ig)shortcode Bjnx75lFFQp → 결제 후 숫자 pkURL. 표본 20/20 이 skipped_paid 라 응답 값은 못 얻는 중
repo (gh)owner/nameURL · 응답
search검색어 'flock camera'URL. fetch 대상이 아님(unsupported)
shortlink단축 코드 ZSABC123 → 해석 후 video idURL
unknownnull 일 수 있음
기존 행 찾는 순서  — 새 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
원본
판정 근거 · 쟁점 판정 필수 메모

JSON 출력

아래 내용을 복사해서 채팅에 붙여넣으시면 그대로 문서에 반영하겠습니다.