[MongoDB] BSON

DataBase 2024. 7. 19. 08:45

 

 

 

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
Posted by bloodguy
,