node package manager
Easy collaboration. Discover, share, and reuse code in your team. Create a free org »

mingo

mingo

JavaScript implementation of MongoDB query language

version build status npm Codecov

Install

$ npm install mingo

Features

For documentation on using query operators see mongodb

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 }
});
 
query.test(someObject)

Searching and Filtering

// `collection` is an Array of objects you want to query
 
// 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
cursor.count();
 
// iterate cursor
// iteration is forward only
while (cursor.hasNext()) {
    console.log(cursor.next());
}
 
// use first(), last() and all() to retrieve matched objects
cursor.first();
cursor.last();
cursor.all();
 
// Filter non-matched objects (
console.log(query.remove(collection));

Aggregation Pipeline

let agg = new mingo.Aggregator([
    {'$match': { "type": "homework"}},
    {'$group':{'_id':'$student_id', 'score':{$min:'$score'}}},
    {'$sort':{'_id': 1, 'score': 1}}
]);
 
let result = agg.run(collection);
 
// shorthand
result = mingo.aggregate(
  collection,
  [
    {'$match': { "type": "homework"}},
    {'$group':{'_id':'$student_id', 'score':{$min:'$score'}}},
    {'$sort':{'_id': 1, 'score': 1}}
  ]
);

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.first();

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

Documentation

Why?

  • Alternative to writing a lot of custom code for transforming collections of JSON 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 build and tests pass

License

MIT