[dancer-users] Question on MongoDB and Dancer

Chad Wallace cwallace at lodgingcompany.com
Thu Oct 19 18:23:34 BST 2017


On Thu, 19 Oct 2017 07:22:46 +0100
Gavin Colborne <gavin at littleforest.co.uk> wrote:

> Thanks Richard and everyone,
> 
> I added the ".item" so my view shows: [% entries.$id.item('time') %] I
> still don't see any results :(
> 
> I now see in my terminal the following: Argument "client" isn't
> numeric in numeric comparison (<=>)
> Which from what I can tell from Gabor's great site
> https://perlmaven.com/argument-isnt-numeric-in-numeric is some numeric
> operation problem.

That's because you're using "entries.keys.nsort".  If you change that to
"entries.keys.sort" you won't get the warning.  If "client" is a key,
you don't want a numeric sort.

> Do you have any examples of controllers passing Mongo data to views
> so I can compare?

The "$docs->find()" call returns a cursor object.  You can read about
that in the MongoDB::Cursor man page.  The last thing you want to do
is iterate over its keys.

If you use the "all" method on the cursor, it'll return an array of
documents.  So your "entries" key in the template vars hash could be
done like this:

    template 'show_mongo.tt', {
        'entries' => $all_docs = [ $docs->find()->all ],
    };

And then in the view:

    [% FOREACH doc IN entries %]
        [% doc.time %]
    [% END %]


Another way to do it would be to use the cursor directly in the
template (in case you have a humongous dataset).  So your controller
would pass the cursor to the template like this:

    template 'show_mongo.tt', {
        'cursor' => $docs->find(),
    };

and in the view:

    [% WHILE cursor.has_next;
        SET doc = cursor.next %]
        [% doc.time %]
    [% END %]

Then you don't need to store the entire dataset in memory.  You'll only
look at one document at a time.



> My code so far - perhaps the controller is the issue?
> 
> sub connect_mongo {
>     my $client = MongoDB->connect('mongodb://a.b.c.d') or die "Error
> connecting to Mongo";
> my $db = $client->get_database( 'lfi-perl' );
> return($db);
> }
> 
> get '/mongo' => sub {
>     my $db = connect_mongo();
> my $docs = $db->get_collection( 'Test-Collection' );
> my $all_docs;
>      template 'show_mongo.tt', {
>          'entries' => $all_docs = $docs->find(),
>      };
> };
> 
> 
> Appreciate your help,
> 
> Gavin
> 
> 
> 
> Best Regards,
> 
> Gavin Colborne
> 
> Managing Director,
> 
> Tele:     0207 193 2014
> Mobile: 0788 400 4339
> Skype: gavincolborne
> Visit: www.littleforest.co.uk
> 
> [image: Little Forest LFi] <http://www.littleforest.co.uk/>
> 
> On 18 October 2017 at 10:13, Richard Jones <ra.jones at dpw.clara.co.uk>
> wrote:
> 
> > I've been caught by that before. Try [% entries.$id.item('_id') %].
> > For some reason (would interested to learn what), TT doesn't seem
> > to be able to cope with leading underscores in data structures. You
> > can prove entries contains data using:
> > [% USE Dumper(Indent=1) %]
> > [% FOREACH id IN entries %]
> >   <pre>[% Dumper.dump(id) %]</pre>
> > [% END %]
> >
> > or just [% Dumper.dump(entries) %]
> >
> > On 18/10/2017 06:28, Gavin Colborne wrote:
> >
> > Hi Dancers,
> >
> > I am pretty new to Dancer and really like the light nature of the
> > framework.
> >
> > I am trying to create a route which will show data from a MongoDB
> > collection and struggling with the syntax.
> >
> > I have the following in my app:
> >
> > sub connect_mongo {
> >     my $client = MongoDB->connect('mongodb://a.b.c.d') or die "Error
> > connecting to Mongo";
> > my $db = $client->get_database( 'lfi-perl' );
> > return($db);
> > }
> >
> > get '/mongo' => sub {
> >     my $db = connect_mongo();
> > my $docs = $db->get_collection( 'Test-Collection' );
> > my $all_docs;
> >      template 'show_mongo.tt', {
> >          'entries' => $all_docs = $docs->find(),
> >      };
> > };
> >
> > Then in my view the following:
> >
> > [% FOREACH id IN entries.keys.nsort %]
> >
> > [% entries.$id._id %]
> >
> >
> >
> > I am not able to see any data in my view but am also not seeing any
> > errors.
> >
> > Any examples of getting data from Mongo in Dancer would be really
> > helpful.
> >
> > Thank you in advance,
> >
> > Gavin
> >
> >
> >
> >
> >
> >
> >
> > Best Regards,
> >
> > Gavin Colborne
> >
> > Managing Director,
> >
> > Tele:     0207 193 2014
> > Mobile: 0788 400 4339
> > Skype: gavincolborne
> > Visit: www.littleforest.co.uk
> >
> > [image: Little Forest LFi] <http://www.littleforest.co.uk/>
> >
> >
> > _______________________________________________
> > dancer-users mailing
> > listdancer-users at dancer.pmhttp://lists.preshweb.co.uk/mailman/listinfo/dancer-users
> >
> >
> > --
> > Richard Jones
> >
> >
> > _______________________________________________
> > dancer-users mailing list
> > dancer-users at dancer.pm
> > http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
> >
> >  


-- 

C. Chad Wallace, B.Sc.
The Lodging Company
http://www.lodgingcompany.com/
OpenPGP Public Key ID: 0x262208A0



More information about the dancer-users mailing list