2013-12-09 5 views
2

Я хотел бы вставить объект в mongodb, но так как это объект, а не простой хэш-код, поэтому он генерирует исключение, когда я вставляю. Я знаю, это потому, что объект perl на самом деле является благословленным хэшем ref.So , Я блуждаю, если есть способ автоматически конвертировать perl-объект в hash ref, или если есть удобный способ вставить perl-объект в mongodb?Как вставить объект perl непосредственно в mongodb?

, что я имею дело с является модулем Perl с именем SWISS::ListBase (модуль Perl используется для анализа генных банков данных), когда я непосредственно использовать коды ниже для вставки:

$collection->insert($obj); 

он бросает исключение:

type(SWISS::ListBase) unhandled at /usr/local/lib/perl/5.14.12/MongoDB/Collection.pm line 168,<> chunk 1. 

Да, я могу вручную извлечь нужные данные из SWISS :: ListBase и самостоятельно построить хэш, но это действительно утомительно. Поэтому я попытался вставить этот объект напрямую и получил такое исключение. Итак, любые предложения?

+1

Не могли бы вы показать нам какой-нибудь код? Из того, что я вижу [здесь] (https://metacpan.org/pod/MongoDB), это выглядит довольно просто. – Cahu

+0

Да, из документа он просто использует insert() для вставки хеш-ссылки, но объект perl - это благословенный хэш, а не общий хеш. – wuchang

ответ

2

Что вам нужно, это Perl-объект сериализатора. Посмотрите на этом Comparison of Perl serialization Modules

Или использовать предприятие словечек маршала/распаковать: Marshalling and Unmarshalling complex data structures in perl

Во всяком случае, идея состоит в том, что есть вещи, которые не могут быть сериализованы, как открытым сокет, или ссылка к открытому файлу или открытому соединению с базой данных.

+1

Большое спасибо. Я смотрю Data :: Dump, и это то, что мне нужно. Спасибо! – wuchang

+0

@ Vico_Wu, возможно, вы хотели бы посмотреть на 'freeze()' и 'thaw()' также из основного модуля [Storable] (http://perldoc.perl.org/Storable.html). – Cahu

0

Если вы уверены, что вы просто не нужны ссылки на хэш, ничего другого, хранящееся в MongoDB, вы можете попробовать это:

my $copy = { %{$obj} }; 
$collection->insert($copy); 

Я не протестирован с MongoDB Хотя ... но мне кажется разумным работать, так как ниже тест показывает разницу между ними:

C:\>perl -MData::Dumper -MJSON::Syck -E "$obj = { um => 1, dois => 2, tres => [ qw(um dois) ] }; bless $obj, 'Foo::Bar'; say JSON::Syck::Dump($obj); $copy = { %{$obj} }; say JSON::Syck::Dump($copy); say Dumper($t); say Dumper($new)" 
{"um":1,"dois":2,"tres":["um","dois"]} 
{"um":1,"dois":2,"tres":["um","dois"]} 
$VAR1 = bless({ 
      'um' => 1, 
      'dois' => 2, 
      'tres' => [ 
         'um', 
         'dois' 
         ] 
      }, 'Foo::Bar'); 

$VAR1 = { 
     'um' => 1, 
     'dois' => 2, 
     'tres' => [ 
        'um', 
        'dois' 
       ] 
    }; 

JSON :: Syck, кажется DWIM, я не знаю, почему MongoDB не мог сделать то же самое.

Смежные вопросы