Neolithic Populous Metropolis

    @makeflow/mingo

    2.3.6 • Public • Published

    mingo

    JavaScript implementation of MongoDB query language

    version build status npm Codecov Code Quality: Javascript Total Alerts

    Install

    $ npm install mingo

    Features

    For documentation on using query operators see mongodb

    Documentation

    Usage

    On the server side

    // Use as es6 module
    import mingo from 'mingo'
     
    // or vanilla nodeJS
    var mingo = require('mingo')

    For the browser

    // minified UMD module
    <script type="text/javascript" src="./dist/mingo.min.js"></script>
     
    // or gzipped UMD module
    <script type="text/javascript" src="./dist/mingo.min.js.gz"></script>

    Tiny configuration if needed

    // setup the key field for your collection
    mingo.setup({
        key: '_id' // default
    });

    Using query object to test objects

    // create a query with criteria
    // find all grades for homework with score >= 50
    let query = new mingo.Query({
        type: "homework",
        score: { $gte: 50 }
    });
     
    // test if an object matches query
    query.test(someObject)

    Searching and Filtering

    // input is either an Array or any iterable source (i.e Object{next:Function}) including ES6 generators.
     
    // filter collection with find()
    let cursor = query.find(collection)
     
    // shorthand with query criteria
    cursor = mingo.find(collection, criteria)
     
    // sort, skip and limit by chaining
    cursor.sort({student_id: 1, score: -1})
        .skip(100)
        .limit(100)
     
    // count matches. exhausts cursor
    cursor.count()
     
    // classic cursor iterator (old school)
    while (cursor.hasNext()) {
        console.log(cursor.next())
    }
     
    // ES6 iterators (new cool)
    for (let value of cursor) {
      console.log(value)
    }
     
    // all() to retrieve matched objects. exhausts cursor
    cursor.all()

    Aggregation Pipeline

    let agg = new mingo.Aggregator([
        {'$match': { "type": "homework"}},
        {'$group':{'_id':'$student_id', 'score':{$min:'$score'}}},
        {'$sort':{'_id': 1, 'score': 1}}
    ])
     
    // return an iterator for streaming results
    let stream = agg.stream(collection)
     
    // return all results. same as `stream.all()`
    let result = agg.run(collection)

    Integration with custom collection

    // using Backbone.Collection as an example (any user-defined object will do)
    let Grades = Backbone.Collection.extend(mingo.CollectionMixin)
     
    // `collection` is an array of objects
    let grades = new Grades(collection)
     
    // find students with grades less than 50 in homework or quiz
    // sort by score ascending and type descending
    cursor = grades.query({
      $or: [{type: "quiz", score: {$lt: 50}}, {type: "homework", score: {$lt: 50}}]
    }).sort({score: 1, type: -1}).limit(10)
     
    // return grade with the lowest score
    cursor.next()

    The collection to mixin needs to provide a method with signature toJSON() -> Array[Object].

    Why?

    • Alternative to writing lots of custom code for transforming collection of objects
    • Quick validation of MongoDB queries without the need for a database
    • MongoDB query language is among the best in the market and is well documented

    Contributing

    • Submit pull requests to the development branch
    • Squash changes into one commit
    • Run make to ensure tests pass

    License

    MIT

    Install

    npm i @makeflow/mingo

    DownloadsWeekly Downloads

    0

    Version

    2.3.6

    License

    MIT

    Unpacked Size

    487 kB

    Total Files

    64

    Last publish

    Collaborators

    • pullup
    • yggdrasilqh
    • boenfu
    • dizy
    • hardo
    • vilic
    • maolion