mongoDB ObjectID

타미·2021년 12월 31일
1
post-thumbnail

ObjectID란?

  • ObjectID는 몽고디비의 data type 중 하나로, 주로 PK의 데이터 타입으로 사용된다.
  • 몽고디비의 모든 도큐먼트는 _id 필드를 가진다. _id는 어떤 타입이여도 상관없지만 컬렉션 내에서 unique해야 한다.
  • _id의 디폴트 타입은 ObjectID 타입이며, ObjectID를 개발자가 입력하지 않았다면 MongoDB 드라이버가 만들어준다.
  • rdb에서처럼 auto_increment하는 키를 pk로 사용하지않는 이유는 몽고디비가 분산 환경에서 사용되기 때문이다. (샤딩된 환경에서 고유 식별자로 사용)

  • ObjectID는 위 그림과 같이 12바이트이며, 시간+랜덤 값+count의 조합이다.
    • count도 랜덤 값으로 서로 다른 시스템에서 충돌되지 않는 ObjecdtID를 생성하지 않도록 만든 값

ObjectID를 포함한 객체 만들기

type OjbectIDTestStruct struct {
	ID    primitive.ObjectID `bson:"_id,omitempty"`
	Name string
}
  • _id, omitempty도 있어야 한다.
  • omitempty 없으면 로컬에서 초기화된 id가 들어가게 된다. (디비에서 만들어주지 x)

create했을 때 ObjectID가 갱신되지 않는다.

testStruct := OjbectIDTestStruct{Name: "test1"} 
// testSturct.ID = []uint{0,0,0,0,0,0,0,0}

collection.InsertOne(ctx, &testStruct)
// testSturct.ID = []uint{0,0,0,0,0,0,0,0}

결과에서 ObjectID를 뽑아서 갱신할 수 있다.

testStruct := OjbectIDTestStruct{Name: "test1"} 
// testSturct.ID = []uint{0,0,0,0,0,0,0,0}

result, err := collection.InsertOne(ctx, &testStruct)

testStruct.ID = result.InsertedID 
// testStruct.ID = []uint{97,206,146,190,8,...}

created_at 꺼내기

myStruct.ID.Timestamp

(대략적으로) created_at 순서와 비슷하다.

  • "대략적"이라고 하는 이유

    While ObjectId values should increase over time, they are not necessarily monotonic. This is because they:
    Only contain one second of temporal resolution, so ObjectId values created within the same second do not have a guaranteed ordering, and Are generated by clients, which may have differing system clocks.

    • 초 단위까지만 저장하기 때문에, nano second 단위까지 보장하지 않는다.
      • 초 단위까지 일치하는 경우, 어떤 값이 먼저 들어왔는지 알 수 없다.
    • Are generated by clients, which may have differing system clocks. → ? 무슨 의미인지 잘 모르겠음
profile
IT's 호기심 천국

0개의 댓글