2015-02-16 10 views
8

zapisać IP w Mongouzyskać wartość MongoBinData z 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=") } 

jak dostać się początkowe dane w Mongo powłoki?

+0

Czy próbował to zrobić: 'foreach ($ Collection- > find() as $ el) { echo $ doc ['ip'] -> bin; } '. Myślę, że powinno to pomóc, ale nie mam php, aby to zweryfikować teraz, więc proszę dać mi znać, jak to działa. –

+0

Ponadto, chyba że źle rozumiem pytanie, myślę, że powinieneś zmienić tytuł, ponieważ próbujesz pobrać wartość BinData używając PHP, nie używając powłoki Mongo. – wdberkeley

+0

@wdberkeley hi, mam tylko ciąg "BAAAAH8AAAE =", jak uzyskać wartość początkową bez wstawiania/pobierania danych w mongodb – Hett

Odpowiedz

5

Patrząc na hexdump co kończy się w mongod, w porównaniu do tego, co wstawić powinna wyjaśnić wiele:

$ 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 

To pokazuje, że oryginalne 4 bajty skończyć poprzedzony kolejne 4 bajty MongoDB. Powód tego można znaleźć w the BSON spec, podczas przechowywania pliku binarnego, pierwsze 4 bajty będą przechowywać długość wartości, którą zawiera.

Wskazuje to również, co to jest rozwiązanie; po trochę fiddling (nigdy nie używałem MongoDB), skończyło się z:

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

To spowoduje żądanego wyjścia: 127.0.0.1

Powiązane problemy