mongoDB는 기본적으로 컬렉션에 데이터를 넣을 때 ObjectId를 직접 넣지 않는 이상 자동으로 _id에 ObjectId 값이 부여돼서 저장된다.
즉, id를 직접 생성하지 않아도 자동으로 생성되는 ObjectId 값으로 데이터를 조작할 수 있다.
ObjectId는 12byte 크기의 문자와 숫자로 구성된 값이다. ObjectId()의 값을 반환하면 12byte의 hexadecimal 값으로 결과를 반환한다. 이 값들은 각각의 의미를 가지고 있다.
ObjectId("315ae828340736534g4b3275")로 설명하겠다.
315ae828 / 340736534g / 4b3275
⬇️
timestamp / random value / counter
315ae828 : 첫 4byte는 timestamp 값을 의미한다. 이 값은 생성된 데이터의 초 단위로 측정된 값을 의미한다.
340736534g : 다음 5byte는 랜덤으로 생성된 값이다.
4b3275 : 다음 3byte는 증가하는 count이며, 최초값은 랜덤으로 생성된다.
MongoDB는 BSON(Binary JSON) 형태로 데이터를 저장한다.
BSON은 Binary JSON의 약어로, JSON 문서를 바이너리로 인코딩한 포맷이다.
최초에 MongoDB에서 제안했으며, 주로 JSON 형태의 데이터를 저장하거나 네트워크로 전송하는 용도로 사용된다. 바이너리 데이터를 JSON 구조에 추가할 수 있다는 장점이 있다.
참고
Ohgyun. “Bson 이해하기.” 꿀벌개발일지, TISTORY, 26 Mar. 2019, https://ohgyun.com/421.
MongoDB가 처음 개발될 때에는 JSON을 이용해서 개발을 진행했다고 한다. 그러다 문제점이 몇 가지가 발견 되었다.
JSON에서는 표현할 수 있는 방법이 문자열, boolean, 숫자, 배열인데 BSON에서는 더 상세하게 표현할 수 있다. 숫자의 경우는 Integer, Float, Long, Decimal과 같이 분류가 되고 날짜의 형태도 저장이 가능하다.
참고
쿤 Koon. “[Mongodb] Mongodb에서 사용하는 JSON vs Bson.” 쿤즈랜드, TISTORY, 11 Mar. 2021, https://koonsland.tistory.com/86.
ObjectId를 문자열로 변경하는 방법
from bson import ObjectId
oid = ObjectId()
oid_str = str(oid)
# oid_str is now '555fc7956cda204928c9dbab'
문자열을 ObjectId로 변경하는 방법
from bson import ObjectId
oid_str = '555fc7956cda204928c9dbab'
oid2 = ObjectId(oid_str)
print(repr(oid2))
# ObjectId('555fc7956cda204928c9dbab')
이 방법을 통해 mongoDB의 _id에 접근해서 데이터를 조작할 수 있다 !!