Javascript MongoDB database client boasting the following features:
- Intuitive API
- Automatic timestamps (created_at, updated_at)
- Custom string id
- Using id instead of _id
- Insert, update and delete multiple by default
- Returns full object on create
- Updates with $set by default
- Retry connection on fail
npm i mongowave
Connect to database:
const connection = require('mongowave')
Default options:
const db = await connection({
// URL of database server
url: 'mongodb://localhost:27017',
// Name of database
name: 'wdb',
// Automatically set created_at and updated_at fields on change
timestamps: true,
// Function used to generate ids
id: cuid,
// Use 'id' instead of '_id'
simpleid: true,
// The default size for batch queries
batchsize: 20,
// Suppress logging
quiet: false,
// Connection options for Mongodb Client
connection: {
useNewUrlParser: true,
useUnifiedTopology: true
},
// Always convert id to string
stringid: true
})
If you want to use underscore ids and ObjectIds (default MongoDB behavior):
const db = await connection({
// Let MongoDB generate id
id: false,
// Use '_id' instead of 'id'
simpleid: false
})
Insert document:
// Returns the full document:
// { id: '507f191e810c19729de860ea', name: 'hello' }
// Takes only 1 argument: values
const result = await db('project').create({ name: 'hello' })
Insert multiple documents:
// Returns the full documents:
// [
// { id: '507f191e810c19729de860ea', name: 'hello' },
// { id: '607f191e810c19729de860eb', name: 'bye' }
// ]
// Takes only 1 argument: values, must be array of objects
const result = await db('project').create([{ name: 'hello' }, { name: 'bye' }])
Update document (updates multiple if query matches):
// Returns the number of updated documents: { n: 1 }
// Takes 2 arguments: query, values
const result = await db('project').update({ id: '507f191e810c19729de860ea' }, { name: 'bye' })
Delete document (deletes multiple if query matches):
// Returns the number of deleted documents: { n: 1 }
// Takes 1 argument: query
const result = await db('project').delete({ id: '507f191e810c19729de860ea' })
Find documents, all of the mongodb query operators work:
// Returns an array of matching documents
// Takes 2 arguments: query, options
// Find all
const result = await db('project').find()
// Find all with name 'bye'
const result = await db('project').find({ name: 'bye' })
// Find with sorting on 'name' field descending, use 1 for ascending
const result = await db('project').find({}, { sort: { name: -1 } })
// Find only 2
const result = await db('project').find({}, { limit: 2 })
// Find but skip 2
const result = await db('project').find({}, { skip: 2 })
// Find all but don't include the 'name' field in the result
const result = await db('project').find({}, { fields: { name: false } })
// Find all with 'level' field greater than 5
const result = await db('project').find({ level: { $gt: 5 }})
Get document:
// Returns the first matching document
// Takes 2 arguments: query, options
const result = await db('project').get({ name: 'bye' })
Count documents:
// Returns the count of the matching query
// Takes 2 arguments: query, options
const result = await db('project').count({ name: 'bye' })
Null values:
// Creates doc with null name field
const result = await db('project').create({ name: null })
// Returns all docs with null name field
const result = await db('project').find({ name: null })
// Sets all name fields to null
const result = await db('project').update({}, { name: null })
Undefined values:
// Creates doc without name field
const result = await db('project').create({ name: undefined })
// Returns all docs without name field
const result = await db('project').find({ name: undefined })
// Unsets all name fields
const result = await db('project').update({}, { name: undefined })
Use the mongodb client base directly:
db.base.collection('project').findOne({ _id: insert.id })
The mongodb client:
db.client
MongoDB ObjectId short cut:
// Generate a new ID
db.id()
There's also set
, search
, batch
, each
, aggregate
, index
, deindex
, dups
and analyze
. Read the source code to find out how to use them.
MIT Licensed. Enjoy!