Nutty Professor Movie

    @albert-team/mongol
    TypeScript icon, indicating that this package has built-in type declarations

    0.9.0 • Public • Published

    Mongol

    Minimalistic MongoDB helper for Node.js.

    FEATURES

    INSTALLATION

    Requirements

    • Node.js >= 10
    • MongoDB >= 3.6

    Instructions

    With yarn:

    $ yarn add @albert-team/mongol

    With npm:

    $ npm i @albert-team/mongol

    GET STARTED

    The easy way:

    const { Mongol } = require('@albert-team/mongol')
    
    const main = async () => {
      const mongol = new Mongol('mongodb://localhost:27017/myproject', 'myproject')
      const coll = await mongol.promisifiedCollection('mycollection')
    
      // ...now you can use coll variable as a normal Collection object
    
      await mongol.disconnect()
    }
    main()

    The hard way:

    const { Mongol } = require('@albert-team/mongol')
    
    const main = async () => {
      const mongol = new Mongol('mongodb://localhost:27017/myproject', 'myproject', {
        // you can pass any valid MongoClient options here
        client: { useNewUrlParser: true, useUnifiedTopology: true }
      })
      await mongol.connect()
      const db = mongol.database
      const coll = db.collection('mycollection')
    
      // ...now you can use coll variable as a normal Collection object
    
      await mongol.disconnect()
    }
    main()

    USAGE

    Auto-connect support

    To access Db object, instead of manually calling Mongol.connect():

    await mongol.connect()
    const db = mongol.database

    Just use Mongol.promisifiedDatabase and you are good to go:

    const db = await mongol.promisifiedDatabase

    To fetch an ExtendedCollection object, instead of manually calling Mongol.collection():

    await mongol.connect()
    const coll = mongol.collection('mycollection')

    Just use Mongol.promisifiedCollection() and you are good to go:

    const coll = await mongol.promisifiedCollection('mycollection')

    Enhanced JSON Schema draft-4 support

    Instead of throwing errors on schemas with omitted keywords ($ref, $schema, default, definitions, format and id), Mongol can help you ignore them quietly:

    const usedSchema = await mongol.setSchema('mycollection', originalSchema, {
      ignoreType: true,
      ignoreUnsupportedKeywords: true
    })

    Database hook/trigger support

    You can attach a hook to a collection either by using ExtendedCollection.attachHook():

    const coll = await mongol.promisifiedCollection('mycollection')
    // or
    // const coll = mongol.collection('mycollection')
    coll.attachHook({
      before: (context) => console.log(`Before ${context.operation}`),
      after: (context) => console.log(`After ${context.operation}`)
    })
    await coll.insertOne({ foo: 'bar' })
    // Before insertOne
    // After insertOne

    Or using Mongol.attachDatabaseHook():

    const coll = db.collection('mycollection')
    mongol.attachDatabaseHook(coll, {
      before: (context) => console.log(`Before ${context.operation}`),
      after: (context) => console.log(`After ${context.operation}`)
    })
    await coll.insertOne({ foo: 'bar' })
    // Before insertOne
    // After insertOne

    Notice:

    • Using ExtendedCollection.attachHook() is recommended, because it allows you to chain method calls as in the nested hooks example below.
    • Mongol.attachDatabaseHook() returns the original collection object but casted to ExtendedCollection anyway.

    Nested hooks:

    const coll = mongol
      .collection('mycollection')
      .attachHook({
        before: () => console.log('Inner before'),
        after: () => console.log('Inner after')
      })
      .attachHook({
        before: () => console.log('Outer before'),
        after: () => console.log('Outer after')
      })
    await coll.insertOne({ foo: 'bar' })
    // Outer before
    // Inner before
    // Inner after
    // Outer after

    Want "unhooked" version? Just create another collection object:

    const another = mongol.collection('mycollection') // this has nothing to do with coll variable above
    await another.insertOne({ foo: 'bar' })
    //

    Useful builtin hooks

    Timestamp hook:

    const { createTimestampHook } = require('@albert-team/mongol/builtins/hooks')
    
    const coll = mongol
      .collection('mycollection')
      .attachHook(createTimestampHook({ namingConventions: ['unchanged', 'snakecase'] }))

    Notice: Replacement document in replace operations (findOneAndReplace and replaceOne) is considered a new one, hence uses createdAt/created_at.

    API DOCUMENTATION

    Read more here.

    CHANGELOG

    Read more here.

    Install

    npm i @albert-team/mongol

    DownloadsWeekly Downloads

    2

    Version

    0.9.0

    License

    MIT

    Unpacked Size

    32.9 kB

    Total Files

    19

    Last publish

    Collaborators

    • lqmanh