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
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. –
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
@wdberkeley ciao, ho solo una stringa "BAAAAH8AAAE =", come ottenere il valore iniziale senza inserire/recuperare i dati in mongodb – Hett