JavaScript implementation of MongoDB query language
npm install @jsreport/mingo





$ npm install mingo`Features
- Supports Dot Notation for both __ and __ selectors
- Query and Projection Operators
- Array Operators
- Comparisons Operators
- Element Operators
- Evaluation Operators
- Logical Operators
- Aggregation Framework Operators
- Pipeline Operators
- Group Operators
- Projection Operators
- Arithmetic Operators
- Array Operators
- Boolean Operators
- Comparisons Operators
- Conditional Operators
- Date Operators
- Literal Operators
- Set Operators
- String Operators
- Variable Operators
- Support for adding custom operators
- Match against user-defined types
- Support for aggregaion variables
- $$ROOT,$$CURRENT,$$DESCEND,$$PRUNE,$$KEEP,$$REMOVE
- ES6 module compatible
- Support integrating with custom collections via mixin
- Query filter and projection streaming.For documentation on using query operators see mongodb
Documentation
- API
- Custom OperatorsUsage
On the server side
`js
// Use as es6 module
import mingo from 'mingo'// or vanilla nodeJS
var mingo = require('mingo')
`For the browser
`html
// minified UMD module
// or gzipped UMD module
`Tiny configuration if needed
`js
// setup the key field for your collection
mingo.setup({
key: '_id' // default
});
`Using query object to test objects
`js
// 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
`js
// 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
`js
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
`js
// 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 documentedContributing
* Submit pull requests to the development branch
* Squash changes into one commit
* Run make` to ensure tests pass