D. Budak
D. Budak

Reputation: 43

Mongoose Fails to retrieve documents

I am learning MongoDB+Mongoose+Express right now. And I am facing a bug I can't figure out myself.

My MongoDB setup (A DB with 2 collections, each has some documents): A DB with 2 collections, each has some documents

app.js connection to a database:

const dbConnectionString = process.env.MONGODB_URI || 'mongodb://localhost';
mongoose.connect(dbConnectionString + '/blog');

posts.js model:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PostsSchema = new Schema({
    any: {}
});

var Posts = mongoose.model('Posts', PostsSchema);

module.exports = Posts;

blog.js route:

var express = require('express');
var router = express.Router();
var Posts = require('../models/posts')

router.get('/', function(req, res, next) {
  console.log('Route works');
  console.log(Posts);
  Posts.find((err,posts) => {
    if( err ) return console.log('DB Error', err);
    console.log('Posts Received', posts);
    res.render('blog', { title: 'My Blog', posts : posts });  
  });
});

module.exports = router;

when I run mongodb and node server, accessing it successfully console.logs Schema and

Route works
Posts Received []

So while the connection to a database seem to work(I don't get errors) I can't get the data from it. I know that I am missing something obvious due to the lack of knowledge but my search through mongoose docs didn't help. Please advise and thank you for your help!

Upvotes: 1

Views: 1183

Answers (1)

Israel Zinc
Israel Zinc

Reputation: 2769

The problem is that you are not passing any object to find.

The find function in mongoose requires a query parameter. If you need to retrieve the whole collection, you can pass an empty object:

MongooseSchema.find({},callback)

The first object is the query. You can use some selectors there too. For example, let's say you want everyone with a determined title, in that case you can do something like:

MongooseSchema.find({title:"title"},callback)

For more than one query parameter, you can separate by commas:

MongooseSchema.find({title:"title",subtitle:"subtitle"},callback)

and so on. I recommend you taking a look at the mongoose manual part on this matter:

http://mongoosejs.com/docs/queries.html

[Update]

The problem in this case was that mongoose naming conventions were not matching the names used by you. Mongoose does queries in lower-case names, and in this case did not find the Posts collection because of the upper-case P in the beginning of the name. It was solved by changing by 'posts', all in lower-case.

Just a second reminder, mongoose also pluralizes the names when creating collections, so one should be also aware of this fact when creating collections in mongodb.

Reference by @veeram: http://mongoosejs.com/docs/guide.html#collection

Upvotes: 2

Related Questions