从mongo shell获取MongoBinData值

Het*_*ett 8 php mongodb

我在mongo中保存IP

$db = new MongoClient();

$db->selectCollection('test', 'test')->insert([
    'ip'=> new MongoBinData(inet_pton('127.0.0.1'), MongoBinData::BYTE_ARRAY),
]);
Run Code Online (Sandbox Code Playgroud)

蒙戈贝壳

> db.test.find()
{ "_id" : ObjectId("54e1aeeb84663f3407000030"), "ip" : BinData(2,"BAAAAH8AAAE=") }
Run Code Online (Sandbox Code Playgroud)

如何在mongo shell中获取初始数据?

Sjo*_*jon 5

看看mongod中最终结果的hexdump,与你插入的内容相比应该澄清很多:

$ php -r 'echo inet_pton("127.0.0.1");'|hexdump 
0000000 007f 0100                              
0000004

$ php -r 'echo base64_decode("BAAAAH8AAAE=");'|hexdump 
0000000 0004 0000 007f 0100                    
0000008
Run Code Online (Sandbox Code Playgroud)

这表明原始的4个字节最终以mongodb中的另外4个字节作为前缀.其原因可以在BSON规范中找到,当存储二进制时,前4个字节将存储它包含的值的长度.

这也暗示了解决方案的内容; 经过一点点摆弄(我从未使用过mongodb),我最终得到了:

> db.test.find().forEach(function(d){
    var h = d.ip.hex();
    print(
            parseInt(h.substr(8,2), 16)+'.'
            +parseInt(h.substr(10,2), 16)+'.'
            +parseInt(h.substr(12,2), 16)+'.'
            +parseInt(h.substr(14,2), 16));
    });
Run Code Online (Sandbox Code Playgroud)

这将产生您想要的输出: 127.0.0.1