2

私は mongoose を使用して、次の (単純化および圧縮された) データ モデルを設定します。

package Model::Tag;
use Moose; 
use Mongoose::Class; with 'Mongoose::Document';
has 'value'         => (is  => 'rw', isa => 'Str', required => 1);
no Moose;
__PACKAGE__->meta->make_immutable;

package Model::Document;
use Moose; 
use Mongoose::Class; with 'Mongoose::Document';
has 'title'         => (is => 'rw', isa => 'Str', required => 1);
has_many 'tags'     => (is => 'rw', isa => 'Model::Tag');
no Moose;
__PACKAGE__->meta->make_immutable;

私のテストの重要な部分は次のとおりです。

package main;
use strict; 
use warnings;
use Data::Dumper;

my $expected; my $got;

my $doc = Model::Document->new(title => 'My new document with many tags');
my $tag1 = Model::Tag->new(value => 'foo');
my $tag2 = Model::Tag->new(value => 'bar');

my $x1 = $doc->tags->add($tag1);
my $x2 = $doc->tags->add($tag2);

# print "x1 = $x1 x2 = $x2 \n";

my $document_tags = $doc->tags;
print Dumper $document_tags;

can_ok($document_tags, 'all');

my $tag_array_ref = $document_tags->all();

今問題:

$document_tags のダンプされた出力は、Mongoose::Join オブジェクトです。

$VAR1 = bless( {
             'delete_buffer' => {},
             'with_class' => 'Model::Tag',
             'buffer' => {
                           '58102804' => bless( {
                                                  'value' => 'foo'
                                                }, 'Model::Tag' ),
                           '58069732' => bless( {
                                                  'value' => 'bar'
                                                }, 'Model::Tag' )
                         }
           }, 'Mongoose::Join' ); 

また、 Mongoose::Joinに関するドキュメントには、メソッドがリストされています。

add, remove, find, find_one, first, all, hash_on, hash_array, query, collection, with_collection_name

しかし、呼び出し

$document_tags->all();

エラーが発生します

Can't use an undefined value as a HASH reference at C:/Perl/site/lib/Mongoose.pm line 132.

何が問題ですか?

あなたの助けとアイデアを前もって感謝します。

4

1 に答える 1

0

エラー メッセージは、テスト プログラムから直接ではなく、Mongoose から送信されています。Mongoose の最新バージョン (0.23) の Mongoose.pm の 132 行目は、MongoDB への接続を確立するメソッドにあります。

そのリードに従って、テスト コードに への呼び出しが含まれていないことに気付きましたMongoose->db()。これは、接続するデータベースを指定するために必要です。それを追加してテスト プログラムを試してみたところ、MongoDB から属性 (つまり、タグ) を取得しようとする前に、ドキュメントが最初に MongoDB に保存されていないことに気付きました。

問題を解決するために行った変更を加えたテスト コードを次に示します。キー ビットは行で始まります# Connect to database

package Model::Tag;
use Moose;
use Mongoose::Class; with 'Mongoose::Document';
has 'value'         => (is  => 'rw', isa => 'Str', required => 1);
no Moose;
__PACKAGE__->meta->make_immutable;

package Model::Document;
use Moose;
use Mongoose::Class; with 'Mongoose::Document';
has 'title'         => (is => 'rw', isa => 'Str', required => 1);
has_many 'tags'     => (is => 'rw', isa => 'Model::Tag');
no Moose;
__PACKAGE__->meta->make_immutable;

package main;
use strict;
use warnings;
use Data::Dumper;

my $doc = Model::Document->new(title => 'My new document with many tags');
my $tag1 = Model::Tag->new(value => 'foo');
my $tag2 = Model::Tag->new(value => 'bar');

my $x1 = $doc->tags->add($tag1);
my $x2 = $doc->tags->add($tag2);

my $document_tags = $doc->tags;
print Dumper $document_tags;

# Connect to database
Mongoose->db('foo');
# and save our document first
$doc->save();

# now we can retrieve the array (note, not array ref) of tags
my @tag_array = $document_tags->all();
print Dumper(\@tag_array);
于 2013-03-31T04:46:25.330 に答える