MongoDB에서 사용하는 데이터 포맷은 BSON (Binary encoded Javascript Object Notation)
JSON에 비해 human-readable 하지 못하지만,
JSON에선 지원할 수 없는 더 많은 data type을 지원할 수 있으며, machine-parse에 더 유리함.
// JSON이 이런 형태라면
{"hello": "world"}
// BSON은 이런 형태
\x16\x00\x00\x00 // 첫 4바이트(int32)는 document length
\x02 // data type (0x02 = String)
hello\x00 // 필드명
\x06\x00\x00\x00world\x00 // 필드값
\x00 // 0x00 = type EDO (end of object)
mongodump로 덤프한 bson 파일이 있는데 내용이 궁금하다면 bsondump 를 이용하면 됨.
// 이렇게 하면 mydata.json 파일에 라인당 1개씩 document가 json으로 저장되어 있음
bsondump mydata.bson > mydata.json
jq 를 이용하면 좀 더 디테일한 탐색이 가능함.
// ns가 mydb.mycollection이고 op가 u인 첫번째 document
cat mydata.json | jq -s 'map(select(.ns == "mydb.mycollection" and .op == "u")) | .[0]'
PHP로 mydata.bson 파일을 parsing 하는 방법은 아래와 같음.
// PHP MongoDB extension 설치되어 있어야 함
// https://www.php.net/mongodb
// bson 파일을 읽어서 PHP array|object 배열로 변환
function convertBsonFileToArray(string $bsonPath): array
{
if (!file_exists($bsonPath)) {
throw new Exception('File not found: '.$bsonPath);
}
$docs = [];
$typeMap = [
'root' => 'array',
'document' => 'array',
'array' => 'array'
];
$data = file_get_contents($bsonPath);
while ($data !== '') {
// 4바이트를 읽어 document 길이를 알아냄
$docLen = unpack('V', substr($data, 0, 4))[1];
// PHP object|array로 변경
$docs[] = MongoDB\BSON\toPHP(substr($data, 0, $docLen), $typeMap);
$data = substr($data, $docLen);
}
return $docs;
}
[참고]
https://www.mongodb.com/resources/languages/bson
https://bsonspec.org/spec.html
https://www.php.net/manual/en/function.mongodb.bson-tophp.php
'DataBase' 카테고리의 다른 글
[MongoDB] mergeable chunk list 확인 (0) | 2024.08.07 |
---|---|
[MongoDB] Range deletion (0) | 2024.07.23 |
[MongoDB] chunk/range size 변경 (0) | 2024.07.11 |
[MongoDB] chunk 관리 (0) | 2024.07.04 |
[MongoDB] oplog 분석 (0) | 2024.05.29 |