29 July 2014

NOSQL从10年开始已经发展了4年了。其中最火的Mongodb也被人熟知,不过自己一直没有机会了解下这方面东东,最近有时间稍微看了下Mongodb的bson协议,在同事的指导下,整理出来分享给大家。至于BSON的概念我就不赘述了,自己找度娘。

下面是用java写的将数据生成BSON二进制的伪代码:


    map = new map();
    map.put("data","{id:'1',name:'张三'}");
    BSONObject  bson =parse(map);
    byte[] bsonBytes = bson.toByte();

生成结果为:


    bsonBytes = { 52, 0, 0, 0, 5, 100, 97, 116, 97, 0, 36, 0, 0, 0, 0,123,
    0, 105, 0, 100, 0, 58, 0, 39, 0, 49, 0, 39, 0, 44, 0, 110,0, 97, 0, 109,
    0, 101, 0,58, 0, 39, 0, 32, 95, 9, 78, 39, 0,125, 0, 0 };
为了后面说明方便,先将bsonBytes进行简单的格式化:

    bsonBytes = { 
     52, 0, 0, 0, 
     5, 
     100, 97, 116, 97, 
     0, 
     36, 0, 0, 0, 
     0,
    
    123, 0, 105, 0, 100, 0, 58, 0, 39, 0, 49, 0, 39, 0, 44, 0, 110,0, 97,
    0, 109, 0, 101, 0,58, 0, 39, 0, 32, 95, 9, 78, 39, 0,125, 0, 
     0 
     };

打开BSON协议页面:http://bsonspec.org/spec.html,根据该页面将bsonBytes为生成的二进制注释。


    bsonBytes = {
    52, 0, 0, 0,   int32 is the total number of bytes comprising the document 52表示文档的总长度】
    5,                   "\x05" e_name binary Binary data5表示表示e_name的类型是二进制的】
    100, 97, 116, 97, :e_name:cstring byte*) "\x00",这里表示ename的主体】(字符串形式为:data)
    0,                             :e_name:cstring byte*) "\x00",ename0结尾】
    36, 0, 0, 0, int32 subtype (byte*)element主体 int3236表示消息主体的长度】
    0,                int32 subtype (byte*)element主体 subtype 0表示消息主体的类型微二进制:subtype ::= "\x00" Generic binary subtype
    123, 0, 105, 0, 100, 0, 58, 0, 39, 0, 49, 0, 39, 0, 44, 0, 110,0, 97, 0, 109, 0, 101, 0,58, 0, 39, 0, 32, 95, 9, 78, 39, 0,125, 0,           【消息主体的二进制数据】(字符串形式为:{id:'1',name:'张三'})
    0                 document ::= int32 e_list "\x00" 文档主体以0结尾】
    
    };

over!!!o(∩∩)o…





Fork me on GitHub