2013-12-09 4 views
2

개체를 mongodb에 삽입하고 싶습니다. 그러나이 개체가 단순 해시 참조가 아니기 때문에 insert.I에 예외가 발생하므로 perl 개체는 실제로 축복 된 해시 ref.So이므로 예외가 발생합니다. 내가 자동으로 perl 객체를 hash ref로 변환하는 방법이 있거나 mongodb에 perl 객체를 삽입하는 편리한 방법이 있다면 방황하고 있습니까?perl 오브젝트를 mongodb에 직접 삽입하는 방법은 무엇입니까?

은 제가 처리하고하는 이름의 펄 모듈 SWISS::ListBase (유전자 은행 데이터를 구문 분석하는 데 사용되는 펄 모듈)이며 내가 직접 삽입하려면 다음 코드를 사용하는 경우 :

: 예외를 throw

$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

펄 객체 시리얼 라이저입니다. 전문 용어, 기업을 사용하려면이 Comparison of Perl serialization Modules

에서보세요 또는정렬 화/비 정렬 화 : Marshalling and Unmarshalling complex data structures in perl

어쨌든, 아이디어는 참조가 열려있는 소켓처럼 직렬화 할 수없는 일들이, 또는이다 열려있는 파일 또는 열려있는 데이터베이스 연결.

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

나는 비록 MongoDB를 테스트하지 않았다 ... 그러나 그것은 합리적인 보인다 : 방금 MongoDB를 저장 다른 해시 참조, 아무것도 필요없는 확실한 경우

+1

많은 감사합니다. Data :: Dump를 살펴보고 필요한 항목입니다. 감사합니다. – wuchang

+0

@Vico_Wu, 아마도 'Storable'(http://perldoc.perl.org/Storable.html) 코어 모듈에서'freeze()'와'thaw()'를보고 싶을 것입니다. – Cahu

0

, 당신이 시도 할 수

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의이 같은 행동을 할 수없는 이유를 잘 모르겠어요, : 테스트 아래 그들 사이의 차이를 보여줍니다부터 작동합니다.

관련 문제