2015-02-16 6 views
8

I IP speichern in Mongoerhalten MongoBinData Wert von Mongo Shell

$db = new MongoClient(); 

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

Mongo Mantel

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

wie Anfangsdaten in Mongo Shell zu bekommen?

+0

Haben Sie versucht, dies zu tun: 'foreach ($ Sammlungs- > find() als $ el) { echo $ doc ['ip'] -> bin; } '. Ich denke, es sollte helfen, aber ich habe kein PHP, um dies jetzt zu überprüfen, also lassen Sie mich bitte wissen, wie es geht. –

+0

Wenn Sie die Frage nicht falsch verstehen, sollten Sie den Titel ändern, da Sie versuchen, den BinData-Wert mithilfe von PHP zu ermitteln, ohne die mongo-Shell zu verwenden. – wdberkeley

+0

@wdberkeley Hallo, ich habe nur Zeichenfolge "BAAAAH8AAAE =", wie bekomme ich Anfangswert ohne Einfügen/Daten in mongodb abrufen – Hett

Antwort

5

Mit Blick auf der hexdump von dem, was in mongod endet, im Vergleich zu was Sie viel klären einsetzen sollten:

$ 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 

Dies zeigt, dass das ursprüngliche 4 Bytes durch weitere 4 Bytes in mongodb voran enden. Der Grund dafür kann in the BSON spec gefunden werden, wenn ein Binary gespeichert wird, speichern die ersten 4 Bytes die Länge des darin enthaltenen Wertes.

Dies deutet auch an, was die Lösung ist; nach ein wenig Gefummel (ich habe noch nie verwendet mongodb), landete ich mit:

> 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)); 
    }); 

Diese in der gewünschten Ausgabe führen: 127.0.0.1

Verwandte Themen