Meteor .find() from Collection returns [object Object]

Running on Ubuntu

Data.js

//Collections
Database = new Meteor.Collection('data');

if (Meteor.isClient) {
  Template.main.data = function () {
    var c = Database.find();
    return c;
  };
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}

data.html

<head>
  <title>data</title>
</head>

<body>
  {{> main}}
</body>

<template name="main">
  {{data}}
</template>

I inserted into the db using mongo:

> db.Database.insert({title: 'ShouldWork'});
> db.Database.find();
{ "_id" : ObjectId("5296403855ee6e1350b35afb"), "title" : "ShouldWork" }

Yet when I run the site it just returns [object Object]..

There should be autopublish on and insecure, This has become quite the roadblock for me to clear in learning the framework.

Upvotes: 2

Views: 6736

Answers (2)

Sourabh
Sourabh

Reputation: 481

How to access data in Mongo DB from html ?

First of all you need to have the Mongo DB instance present in global variable i:e it must be declared in any .js file as below. It is not part of client or server code

Say we create a Collection of Events in one of the js files.

    EventList = new Mongo.Collection('Events');

Now, in order to access all the objects from HTML, we would need a Helper function inside client in our .js file. Below is Helper used:-

Template.viewEvent.helpers  ({ 
    //NOTE : 'event' is the name of variable from html template
    'event' : function () {
         //returns list of Objects for all Events
         return EventList.find().fetch();
     }
    'users' : function () {
         //returns reference to Document for all users
         return UserList.find().fetch();
     }

});

Just left to Display content on .html:-

Say EventList Collection has fields Event_Name, Event_Date. Below would be the html template code

<template name="viewEvent">
   <h2>View Event</h2>
   <!-- Iterate on all Objects fetched by the Helper Class-->
   {{#each event}}
      {{Event_Name}} : {{Event_Date}} 
   {{/each}}

Upvotes: 1

Tarang
Tarang

Reputation: 75945

This is expected. This is because the results of .find() are always a cursor and have multiple objects. You have to decide which one you want or if you want to loop through each one.

1) You want to use one result:

 var c = Database.findOne();

or 2) You want to iterate through each one:

{{#each data}}
    {{title}}
{{/each}}

Additionally be sure to use the property of {{data}} because {{data}}, even with findOne is still an [Object object]. You should use something like {{data.title}} instead depending on the property you want to use.

Upvotes: 6

Related Questions