Skip to content

Instantly share code, notes, and snippets.

@shide1989
Last active July 19, 2019 11:02
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 shide1989/7a88fbc62e89ebfe1cadd40647c450fb to your computer and use it in GitHub Desktop.
Save shide1989/7a88fbc62e89ebfe1cadd40647c450fb to your computer and use it in GitHub Desktop.
MongoDB Node.js Driver simple implementation

Node JS Mongodb Simple driver

This is simple implementation of the MongoDB driver, you can use this brick when you start to work with MongoDB

install : npm i -s mongodb

/**
* Simple MongoDB driver to handle basic calls
* @author Sebastien Hideux <hideux.sebastien@gmail.com>
*/
const { MongoClient, ObjectID } = require('mongodb')
module.exports = (app) => {
const config = {
useNewUrlParser: true,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 1000
}
/**
* Execute a MongoDB Function
* @param database
* @param collection
* @param {function(Collection): (*)} func - MongoDB function to execute
* @return {Promise<CommandResult|*>}
* @private
*/
const _execute = (database, collection, func) => {
try {
return MongoClient
.connect(app.config.mongo.host, config)
.then(async client => {
const col = client.db(database).collection(collection)
const result = await func(col)
await client.close()
return result
})
} catch (e) {
console.error('MongoDB error', e)
}
}
return {
/**
* Export ObjectID
*/
ObjectID,
/**
* Find objects
* @param {String} database - Mongo Database, ex : 'mydb'
* @param {String} collection - Mongo collection, ex : 'users'
* @param {Object} filter - Mongo filter options
* @return {Promise<Array<*>>}
*/
async find(database, collection, filter) {
if ('_id' in filter && typeof filter._id === 'string')
filter._id = new ObjectID(filter._id)
const func = async col => col.find(filter).toArray()
return _execute(database, collection, func)
},
/**
* Create one or many objects
* @param {String} database - Mongo Database, ex : 'mydb'
* @param {String} collection - Mongo collection, ex : 'users'
* @param {object, array} data
* @param {*} options
* @return {{insertedCount: Number, insertedId: String}}
*/
async create(database, collection, data, options) {
/**
* func
* @param {Collection} col
* @return {Promise<*>}
*/
const func = async col => col[!Array.isArray(data) ? 'insertOne' : 'insertMany'](data)
const { insertedId, insertedCount } = await _execute(database, collection, func)
return { insertedId, insertedCount }
},
/**
* Delete a single object
* @param {String} database - Mongo Database, ex : 'mydb'
* @param {String} collection - Mongo collection, ex : 'users'
* @param filter
* @return {Promise<{deletedCount: Number}>}
*/
async delete(database, collection, filter) {
const func = async col => col.deleteOne(filter)
const { deletedCount } = await _execute(database, collection, func)
return { deletedCount }
},
/**
* Update a single object
* @param {String} database - Mongo Database, ex : 'mydb'
* @param {String} collection - Mongo collection, ex : 'users'
* @param filter
* @param {object} data
* @return {Promise<{upsertedId, upsertedCount, modifiedCount, matchedCount}>}
*/
async updateOne(database, collection, filter, data) {
if (typeof data !== 'object')
throw new Error('MongoDB Error, expected data to be an Object')
const func = async col => col.updateOne(filter, { $set: data })
const { modifiedCount, upsertedId, upsertedCount, matchedCount } = await _execute(database, collection, func)
return { modifiedCount, upsertedId, upsertedCount, matchedCount }
},
/**
* Update many objects
* @param {String} database - Mongo Database, ex : 'mydb'
* @param {String} collection - Mongo collection, ex : 'users'
* @param filter
* @param {Array} data
* @return {Promise<{nModified: Number}>}
*/
async updateMany(database, collection, filter, data) {
if (typeof data !== 'object')
throw new Error('MongoDB Error, expected data to be an Object')
const func = async col => col.updateOne(filter, { $set: data })
const { nModified } = await _execute(database, collection, func)
return { nModified }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment