MongoDB slow FindOne vs Find


#1

I’m trying to follow this blog post on how to improve access times by the factor 2 when using findOne vs find: https://blog.serverdensity.com/checking-if-a-document-exists-mongodb-slow-findone-vs-find/

However when I apply it on my back-end (server folder) I get the following error message:

TypeError: Object [object Object] has no method 'limit'

Strangely, the same command works directly in the command line without problems. This is the line of code:

 var resultFind = Scrape.find({userId: scrapeUser, screen: "selectScreen"}, {_id:1}).limit(1);

Using the same line of code except the .limit(1) returns exactly as wanted. What am I missing here? BTW, it didn’t work for another collection either, tried it on Meteor.users (again, works in command line without problems)


#2

http://docs.meteor.com/#/full/find

meteorized-mongo syntax != mongo syntax. Meteor has morphed it a bit when integrating.

You should include the limit and fields in your options {fields: {_id: 1}, …}, as in the docs link.


#3

I just found that out as well, however when I change it to:

var result = Meteor.users.find({ email: gmEmail }, { _id: 1 , limit: 1});

Then I get a new error message:

TypeError: Converting circular structure to JSON

#4

you should really use {fields: {_id: 1} … } instead of just {_id: 1}

not sure about that error btw


#5

I followed your advice and changed it to:

var result = Meteor.users.find({ email: gmEmail }, { fields: {_id: 1 , limit: 1}});

However I get the same error message as before (btw, the doc is useless as it doesn’t give any example for the correct syntax).

I also tried:

var result = Meteor.users.find({ email: gmEmail }, { fields: {_id: 1 }, limit: 1});

With the same error message. It’s not addressing the error message. Any other idea?


#6

OMG, call me stupid. The error was actually in the next line, overlooked it. It was caused by the JSON.stringify I had there


#7

right because fudging the [options] to the query in that way doesnt produce an error, still though, you’ll need to use {fields: …} syntax

The doc does have several examples btw, just look up "fields: " or "limit: " also, in the link I sent you, they explicly say the fields on the [options] object :smile:

personally i’ve found meteor docs to be of high quality xD

edit:

your second line of code is correct. the first is incorrect, because it will interpret “limit” to be a field on your documents. sorry lol, i abuse editing …


#8

As a side note, when you use the limit option in Meteor-Mongo it’s a good practice to use the sort option too:

Sorting in a publish function isn’t usually necessary unless the result of the sort changes which documents are sent (e.g. you are using a limit).


#9

Thanks for the informative link, @massimosgrelli

Please note that it’s not important for me as these collections aren’t published to the client. Its all for back-end purposes only