Skip and Limit Options Return Null in MongoDB

I have a collection called “general_roasts” and am trying to take a random document and return it. Here is the output of db.general_roasts.find() :

meteor:PRIMARY> db.general_roasts.find()
{ "_id" : ObjectId("594b389caad4dc3ae16c5f09"), "text" : "roast 11", "contributor" : "" }
{ "_id" : ObjectId("594b38a1aad4dc3ae16c5f0a"), "text" : "roast 12", "contributor" : "" }
{ "_id" : ObjectId("594b38a5aad4dc3ae16c5f0b"), "text" : "roast 13", "contributor" : "" }
{ "_id" : ObjectId("594b38a7aad4dc3ae16c5f0c"), "text" : "roast 14", "contributor" : "" }
{ "_id" : ObjectId("594b38aaaad4dc3ae16c5f0d"), "text" : "roast 15", "contributor" : "" }

Here is the code:

import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';

const Categories = new Mongo.Collection('categories');
const GeneralRoasts = new Mongo.Collection('general_roasts');
console.log("GENERAL ROASTS: " + GeneralRoasts.find().fetch());

Meteor.methods({
  'Roasts.random': ({category}) => {
    console.log("received random roast request: " + category);
    if (category == 'general')
    {
      let count = GeneralRoasts.find().count();
      let index = Math.floor(Math.random() * count);
      console.log("count: " + count + " index: " + index);
      //var roast = GeneralRoasts.find({skip: index}).fetch();
      var roast = GeneralRoasts.find({}, {skip: index, limit: 1});
      console.log("returning roast: " + roast.text);
      return roast;
    }
  }
});

Meteor.publish('general_roasts', ()=> {
  console.log("published");
  return GeneralRoasts.find();
});
Meteor.publish('categories', () => {
  return Categories.find();
});

export default GeneralRoasts;

The logged output of “Roasts.random” is:

received random roast request: general
I20170621-22:02:32.059(-7)? count: 5 index: 4
I20170621-22:02:32.060(-7)? returning roast: undefined

Does anyone know why null is returned when “roast 14” should be returned?

Thanks in advance!

It’s because you use find(), which returns a cursor. Use findOne() or find().fetch()

2 Likes

In case you weren’t aware, as of MongoDB 3.2 you can also use $sample to return random documents.

2 Likes

That seemed to be the issue, thank you!