Coder Social home page Coder Social logo

mingo's Introduction

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

// Use as es6 module
import mingo from 'mingo'

// or vanilla nodeJS
const mingo = require('mingo')

Changes in 3.0.0

Default exports and operators

The default export of the main module only includes Aggregator, Query, aggregate(), find(), and remove().

Only Query and Projection operators are loaded by default when using the main module. This is done using the side-effect module mingo/init, and automatically includes pipeline operators $project, $skip, $limit, and $sort.

If your application uses a most of the available operators or you do not care about bundle size, you can load all operators as shown below.

// Note that doing this effectively imports the entire library into your bundle and unused operators cannot be tree shaked
import 'mingo/init/system'

By using a side-effect module you can also load operators at startup in a NodeJS environment such as;

# loads only the default operators
node -r 'mingo/init' myscript.js

# load all defined operators
node -r 'mingo/init/system' myscript.js

Custom Operators

The addOperators function for registering custom operators and helper constants have been moved to mingo/core. The constants OP_XXX have been deprecated and replace with an enum type OperatorType also in mingo/core. The values defined include;

  • ACCUMULATOR
  • EXPRESSION
  • PIPELINE
  • PROJECTION
  • QUERY

Lastly, the function argument to addOperators(operatorType, fn) now accepts an object with the these two internal functions;

  • computeValue(obj: object | any[], expr: any, operator: string, options?: ComputeOptions): any
  • resolve(obj: object | any[], selector: string, options?: ResolveOptions): any

Any extra utility may be imported directly from the specific module.

Importing submodules

Submodule imports are supported for both ES6 and ES5. For ES5 projects using commonJS style require() syntax, the esm is used to load the main entry point for compatibility.

The following two examples are equivalent.

ES6

import { $unwind } from 'mingo/operators/pipeline'

ES5

Unlike the ES6 version, it is necessary to specify the operator module in the path to avoid loading any extras

const $unwind = require('mingo/operators/pipeline/unwind').$unwind

Configuration

To support tree-shaking, you may import and register specific operators that will be used in your application.

import { useOperators, OperatorType } from 'mingo/core'
import { $trunc } from 'mingo/operators/expression'
import { $bucket } from 'mingo/operators/pipeline'

useOperators(OperatorType.EXPRESSION, { $trunc, $floor })
useOperators(OperatorType.PIPELINE, { $bucket })

Using query object to test objects

import mingo from 'mingo'

// 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(doc)

Searching and Filtering

import mingo from 'mingo'

// input is either an Array or any iterable source (i.e Object{next:Function}) including ES6 generators.
let criteria = { score: { $gt: 10 } }

let query = new mingo.Query(criteria)

// filter collection with find()
let cursor = query.find(collection)

// alternatively use shorthand
// 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

import { Aggregator } from 'mingo/aggregator'
import { useOperators, OperatorType } from 'mingo/core'
import { $match, $group } from 'mingo/operators/pipeline'
import { $min } from 'mingo/operators/accumulator'

// ensure the required operators are preloaded prior to using them.
useOperators(OperatorType.PIPELINE, { $match, $group })
useOperators(OperatorType.ACCUMULATOR, { $min })

let agg = new 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)

Benefits

  • Better alternative to writing 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

  • Squash changes into one commit
  • Run make test to build and execute unit tests
  • Submit pull request

License

MIT

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.