Skip to content

Instantly share code, notes, and snippets.

@raresloth
Created December 27, 2018 21:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raresloth/7a4f28e33212075891bb5c7ebd386e24 to your computer and use it in GitHub Desktop.
Save raresloth/7a4f28e33212075891bb5c7ebd386e24 to your computer and use it in GitHub Desktop.
A benchmark test for finding a random record using nodejs and mongoose
const mongoose = require('mongoose'),
Benchmark = require('benchmark'),
Promise = require('bluebird')
mongoose.connect('mongodb://localhost:27017/sandbox', {useNewUrlParser: true})
const Model = mongoose.model('Model', new mongoose.Schema({
name: String
}))
findRandom().then(() => {
process.exit(0)
})
async function findRandom() {
await populateData()
await doTest();
}
async function populateData() {
console.log("Populating test data...")
await Model.deleteMany({})
for (let n = 0; n < 10; n++) {
let ops = []
for (let i = 0; i < 100000; i++) {
let r = Math.random()
ops.push({
insertOne: {
document: {
name: n.toString() + i
}
}
})
}
await Model.bulkWrite(ops)
ops = undefined
}
console.log("Complete")
}
async function doTest() {
return new Promise(function(resolve, reject) {
let suite = new Benchmark.Suite
suite
.add('"skip"', {
defer: true,
fn: function(deferred) {
skip().then(() => { deferred.resolve() })
}
})
.add('"sample"', {
defer: true,
fn: function(deferred) {
sample().then(() => { deferred.resolve() })
}
})
.on('cycle', function(event) {
console.log(String(event.target))
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'))
resolve()
})
.run({async: true})
})
}
async function skip() {
let count = await Model.countDocuments({})
return await Model.findOne({}).skip(Math.floor(Math.random()*count)).lean()
}
async function sample() {
let results = await Model.aggregate(
[ { $sample: { size: 1 } } ]
)
return results[0]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment