Performance Difference in Mongoose vs MongoDB Native Driver

bugwheels94
Mar 5, 2018 · 3 min read

I am going to start a new project in which I will use schemaless database and when I was doing freecodecamp, I used Mongoose because I was new to this world. I faced some difficulties using it’s documentation and learned one more layer over already given one thing. This time, I have done partially awesome MongoDB course and I want to try this out. But I am not sure whether it is worth it or not! Stackoverflow Answers did not help that much as they told what I knew already.

Since, the syntax is easy for both to be honest. I took performance as a deciding factor. I decided to take the matter into my hands and run a benchmark on these two pieces of software myself.

I created a collection of 1 million records with the structure

{ 
_id: ObjectID,
subrecord: ObjectID // for reference, usual case in real DB
name: String,
job: String,
company: String
}

Here is results of running different benchmarks on different types of query under different scenarios


READ

findOne

When I did not use index and search by strings then the results were pretty close and nothing is clear

Mongoose x 21.45 ops/sec ±6.11% (53 runs sampled)
MongoDB x 22.33 ops/sec ±6.47% (55 runs sampled)
The Query is {'name': 'bugwheels500000'}

Same goes when I used two parameter instead of one

Mongoose x 11.86 ops/sec ±6.05% (57 runs sampled)
MongoDB x 12.73 ops/sec ±1.59% (61 runs sampled)
Fastest is MongoDB
Query: {name: 'bugwheels94544', job: 'Useless'}

Things got little interesting when I used indexes for searching where MongoDB is significantly faster

Mongoose x 1,929 ops/sec ±9.70% (66 runs sampled)
MongoDB x 4,269 ops/sec ±9.41% (70 runs sampled)
Query: {_id: ‘5a9cf6860acccf5de0cf948a’ }

Same pattern with text index search

Mongoose x 1,427 ops/sec ±9.62% (65 runs sampled)
MongoDB x 4,725 ops/sec ±18.34% (68 runs sampled)
Query: {name: {$text :{ $search: 'bugwheels500000'}}}

find

Again, with indexed search MongoDB is pretty good. Please don’t doubt that I have used Mongoose wrongly and it is not using index. If that would be the case, then mongoose would be same as “Single Parameter Query” in all 3 columns. You never doubted? Leave it then.

The Numbers for basic string search:

Mongoose x 2.24 ops/sec ±4.32% (15 runs sampled)
MongoDB x 2.25 ops/sec ±3.16% (16 runs sampled)
Query: {'name': 'bugwheels500000'}

With _id index

Mongoose x 2,238 ops/sec ±10.68% (70 runs sampled) 
MongoDB x 4,907 ops/sec ±9.31% (70 runs sampled)
Query: {_id: '5a9cf6860acccf5de0cf948a' }

With text index

Mongoose x 1,427 ops/sec ±9.62% (65 runs sampled)
MongoDB x 4,725 ops/sec ±18.34% (68 runs sampled)
Query: {name: {$text :{ $search: 'bugwheels500000'}}}

CREATE

Creating records is also very common operation so let’s look into this too. I will insert the following documents in following benchmarks

{
name: 'bugwheels',
interest: 'Not Many',
job: 'Useless'
}

insert

Insert will only insert one record at one time. Looks like there is negligible difference between insertion whether any additional index is set or not

The results are

With text index on name field

Mongoose x 1,004 ops/sec ±19.87% (64 runs sampled)
MongoDB x 2,589 ops/sec ±8.24% (66 runs sampled)

Without any user defined index

Mongoose x 1,053 ops/sec ±7.50% (71 runs sampled)
MongoDB x 2,452 ops/sec ±8.98% (63 runs sampled)

Pretty same for both! Looks like my effort for creating index wasted. But, it was one liner anyways.

insertMany

This time, I have inserted 100 records at one time and this should cover most bulk insert options. Results are

With text index

Mongoose x 118 ops/sec ±10.07% (69 runs sampled)
MongoDB x 252 ops/sec ±9.27% (47 runs sampled)

Without text index

Mongoose x 126 ops/sec ±9.93% (64 runs sampled)
MongoDB x 279 ops/sec ±8.67% (47 runs sampled)

I am leaving this article here without doing the UD of CRUD and I will also leave MongooseJS :| and use Native Driver as using them is not hard at all. The source code for running the test is here: Source Code.

I really hope that you liked my efforts. Let me know and who knows maybe I will also do update, delete and aggregate(join) too. I am always open for accepting tiniest mistakes so let me know those too. Thanks!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade