Provided by: libmongodbx-class-perl_1.030002-1_all 

NAME
MongoDBx::Class::Moose - Extends Moose with common relationships for MongoDBx::Class documents
VERSION
version 1.030002
PROVIDES
Moose
SYNOPSIS
# create a document class
package MyApp::Schema::Novel;
use MongoDBx::Class::Moose; # use this instead of Moose;
use namespace::autoclean;
with 'MongoDBx::Class::Document';
has 'title' => (is => 'ro', isa => 'Str', required => 1, writer => 'set_title');
holds_one 'author' => (is => 'ro', isa => 'MyApp::Schema::PersonName', required => 1, writer => 'set_author');
has 'year' => (is => 'ro', isa => 'Int', predicate => 'has_year', writer => 'set_year');
has 'added' => (is => 'ro', isa => 'DateTime', traits => ['Parsed'], required => 1);
holds_many 'tags' => (is => 'ro', isa => 'MyApp::Schema::Tag', predicate => 'has_tags');
joins_one 'synopsis' => (is => 'ro', isa => 'Synopsis', coll => 'synopsis', ref => 'novel');
has_many 'related_novels' => (is => 'ro', isa => 'Novel', predicate => 'has_related_novels', writer => 'set_related_novels', clearer => 'clear_related_novels');
joins_many 'reviews' => (is => 'ro', isa => 'Review', coll => 'reviews', ref => 'novel');
sub print_related_novels {
my $self = shift;
foreach my $other_novel ($self->related_novels) {
print $other_novel->title, ', ',
$other_novel->year, ', ',
$other_novel->author->name, "\n";
}
}
around 'reviews' => sub {
my ($orig, $self) = (shift, shift);
my $cursor = $self->$orig;
return $cursor->sort([ year => -1, title => 1, 'author.last_name' => 1 ]);
};
__PACKAGE__->meta->make_immutable;
DESCRIPTION
This module provides some relationship types (i.e. database references) for MongoDB documents and
embedded documents, in the form of Moose attributes. It also provides everything Moose provides, and so
is to replace "use Moose" when creating document classes.
RELATIONSHIP TYPES
This module provides the following relationship types. The differences between different relationships
stem from the different ways in which references can be represented in the database.
belongs_to
Specifies that the document has an attribute which references another, supposedly parent, document. The
reference is in the form documented by MongoDBx::Class::Reference.
belongs_to 'parent' => (is => 'ro', isa => 'Article', required => 1)
In the database, this relationship is represented in the referencing document like this:
{ ... parent => { '$ref' => 'coll_name', '$id' => $mongo_oid } ... }
Calling "parent()" on the referencing document returns the parent document after expansion:
$doc->parent->title;
has_one
Specifies that the document has an attribute which references another document. The reference is in the
form documented by MongoDBx::Class::Reference. This is entirely equivalent to "belongs_to", the two are
provided merely for convenience, the difference is purely semantic.
has_many
Specifies that the document has an attribute which holds a list (array) of references to other documents.
These references are in the form documented by MongoDBx::Class::Reference.
has_many 'related_articles' => (is => 'ro', isa => 'Article', predicate => 'has_related_articles')
In the database, this relationship is represented in the referencing document like this:
{ ... related_articles => [{ '$ref' => 'coll_name', '$id' => $mongo_oid_1 }, { '$ref' => 'other_coll_name', '$id' => $mongo_oid_2 }] ... }
Calling "related_articles()" on the referencing document returns an array of all referenced documents,
after expansion:
foreach ($doc->related_articles) {
print $_->title, "\n";
}
holds_one
Specifies that the document has an attribute which holds an embedded document (a.k.a sub-document) in its
entirety. The embedded document is represented by a class that "does" MongoDBx::Class::EmbeddedDocument.
holds_one 'author' => (is => 'ro', isa => 'MyApp::Schema::PersonName', required => 1)
Note that the "holds_one" relationship has the unfortunate constraint of having to pass the full package
name of the foreign document (e.g. MyApp::Schema::PersonName above), whereas other relationship types
(except "holds_many" which has the same constraint) require the class name only (e.g. Novel).
In the database, this relationship is represented in the referencing (i.e. holding) document like this:
{ ... author => { first_name => 'Arthur', middle_name => 'Conan', last_name => 'Doyle' } ... }
Calling "author()" on the referencing document returns the embedded document, after expansion:
$doc->author->first_name; # returns 'Arthur'
holds_many
Specifies that the document has an attribute which holds a list (array) of embedded documents (a.k.a sub-
documents) in their entirety. These embedded documents are represented by a class that "does"
MongoDBx::Class::EmbeddedDocument.
holds_many 'tags' => (is => 'ro', isa => 'MyApp::Schema::Tag', predicate => 'has_tags')
Note that the "holds_many" relationship has the unfortunate constraint of having to pass the full package
name of the foreign document (e.g. MyApp::Schema::Tag above), whereas other relationship types (except
"holds_one" which has the same constraint) require the class name only (e.g. Novel).
In the database, this relationship is represented in the referencing (i.e. holding) document like this:
{ ... tags => [ { category => 'mystery', subcategory => 'thriller' }, { category => 'mystery', subcategory => 'detective' } ] ... }
defines_many
Specifies that the document has an attribute which holds a hash (a.k.a associative array or dictionary)
of embedded documents in their entirety. These embedded documents are represented by a class that "does"
MongoDBx::Class::EmbeddedDocument.
defines_many 'things' => (is => 'ro', isa => 'MyApp::Schema::Thing', predicate => 'has_things');
When calling "things()" on a document, a hash-ref is returned (not a hash!).
Like "holds_many" and "holds_one", this relationship has the unfortunate constraint of having to pass the
full package name of the foreign document (e.g. MyApp::Schema::Thing above), whereas other relationship
types require the class name only (e.g. Novel).
In the database, this relationship is represented in the referencing (i.e. holding) document like this:
{ ...
things => {
"mine" => { _class => 'MyApp::Schema::Thing', ... },
"his" => { _class => 'MyApp::Schema::Thing', ... },
"hers" => { _class => 'MyApp::Schema::Thing', ... },
}
...
}
joins_one
Specifies that the document is referenced by one other document. The reference in the other document to
this document is in the form documented by MongoDBx::Class::Reference. This "pseudo-attribute" requires
two new options: 'coll', with the name of the collection in which the referencing document is located,
and 'ref', with the name of the attribute which is referencing the document. If 'coll' isn't provided,
the referencing document is searched in the same collection.
joins_one 'synopsis' => (is => 'ro', isa => 'Synopsis', coll => 'synopsis', ref => 'novel')
In the database, this relationship is represented in the referencing document (located in the 'synopsis'
collection) like this:
{ ... novel => { '$ref' => 'novels', '$id' => $mongo_oid } ... }
When calling "synopsis()" on a Novel document, a "find_one()" query is performed like so:
$db->get_collection('synopsis')->find_one({ 'novel.$id' => $doc->_id })
Note that passing a 'required' option to "joins_one" has no effect at all, the existence of the
referencing document is never enforced, so "undef" can be returned.
joins_many
Specifies that the document is referenced by other documents. The references in the other document to
this document are in the form documented by MongoDBx::Class::Reference. This "pseudo-attribute" requires
two new options: 'coll', with the name of the collection in which the referencing documents are located,
and 'ref', with the name of the attribute which is referncing the document. If 'coll' isn't provided, the
referencing documents are searched in the same collection.
joins_many 'reviews' => (is => 'ro', isa => 'Review', coll => 'reviews', ref => 'novel')
In the database, this relationship is represented in the referencing documents (located in the 'reviews'
collection) like this:
{ ... novel => { '$ref' => 'novels', '$id' => $mongo_oid } ... }
When calling "reviews()" on a Novel document, a "find()" query is performed like so:
$db->get_collection('reviews')->find({ 'novel.$id' => $doc->_id })
And thus a MongoDBx::Class::Cursor is returned.
Note that passing the 'required' option to "joins_many" has no effect at all, and the existance of
referncing documents is never enforced, so the cursor can have a count of zero.
AUTHOR
Ido Perlmuter, "<ido at ido50.net>"
BUGS
Please report any bugs or feature requests to "bug-mongodbx-class at rt.cpan.org", or through the web
interface at <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MongoDBx-Class>. I will be notified, and
then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc MongoDBx::Class::Moose
You can also look for information at:
• RT: CPAN's request tracker
<http://rt.cpan.org/NoAuth/Bugs.html?Dist=MongoDBx::Class>
• AnnoCPAN: Annotated CPAN documentation
<http://annocpan.org/dist/MongoDBx::Class>
• CPAN Ratings
<http://cpanratings.perl.org/d/MongoDBx::Class>
• Search CPAN
<http://search.cpan.org/dist/MongoDBx::Class/>
SEE ALSO
MongoDBx::Class::Document, MongoDBx::Class::EmbeddedDocument, Moose.
LICENSE AND COPYRIGHT
Copyright 2010-2014 Ido Perlmuter.
This program is free software; you can redistribute it and/or modify it under the terms of either: the
GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
perl v5.18.2 2014-02-04 MongoDBx::Class::Moose(3pm)