2015-02-16 20 views
8

risparmio IP in Mongoottenere il valore MongoBinData da mongo shell

$db = new MongoClient(); 

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

mongo shell

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

come ottenere i dati iniziali in guscio mongo?

+0

Hai provato a fare questo: 'foreach ($ Collezione > find() as $ el) { echo $ doc ['ip'] -> bin; } '. Penso che dovrebbe essere d'aiuto, ma non ho php per verificarlo ora, quindi per favore fammi sapere come va. –

+0

Inoltre, a meno che non fraintenda la domanda, penso che dovresti cambiare il titolo dato che stai cercando di recuperare il valore BinData usando PHP, non usando la shell mongo. – wdberkeley

+0

@wdberkeley ciao, ho solo una stringa "BAAAAH8AAAE =", come ottenere il valore iniziale senza inserire/recuperare i dati in mongodb – Hett

risposta

5

Guardando il hexdump di ciò che finisce in mongod, rispetto a ciò che si inserisce dovrebbe chiarire un sacco:

$ 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 

Questo dimostra che l'originale 4 byte finiscono preceduto da un altro 4 byte in MongoDB. La ragione di ciò può essere trovata in the BSON spec, quando si memorizza un file binario, i primi 4 byte memorizzeranno la lunghezza del valore che contiene.

Questo suggerisce anche qual è la soluzione; dopo un po 'di giocherellare (mongodb non ho mai usato), ho finito con:

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

Questo si tradurrà in l'output desiderato: 127.0.0.1

Problemi correlati