2013-12-09 47 views
2

我想插入一个对象到mongodb,但由于这是一个对象,而不是一个简单的哈希引用,所以它会在插入时引发异常。我知道,这是因为perl对象实际上是一个有福的哈希引用。 ,我徘徊是否有一种方法可以让我自动将perl对象转换为hash ref,或者是否有方便的方式将perl对象插入到mongodb中?如何将一个perl对象直接插入到mongodb中?

我所处理的是SWISS::ListBase Perl模块命名(用于解析基因库数据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中不能这样做。

相关问题