Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/paolosarti/expression2mongoquery

Transform javascript expression to mongo queries
https://github.com/paolosarti/expression2mongoquery

Last synced: 2 months ago
JSON representation

Transform javascript expression to mongo queries

Awesome Lists containing this project

README

        

# expression2mongoquery
[![Build Status](https://travis-ci.org/PaoloSarti/expression2mongoquery.svg?branch=master)](https://travis-ci.org/PaoloSarti/expression2mongoquery)
[![Coverage Status](https://coveralls.io/repos/github/PaoloSarti/expression2mongoquery/badge.svg?branch=master)](https://coveralls.io/github/PaoloSarti/expression2mongoquery?branch=master)
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)

## Description
This library compiles javascript expressions to MongoDB queries. In this way, filters can be expressed easily and in a more compact way, without having to write a ton of curly braces ;).
It could be used to specify filters in a plain text configuration.

## Installation
```bash
npm i --save expression2mongoquery
```

## Usage
### Simple Example
```js
const assert = require('assert')
const expressionToMongoQuery = require('expression2mongoquery')()
const query = expressionToMongoQuery('a == "value" && b > 42' )
assert.deepStrictEqual(query, {
a: 'value',
b: {
$gt: 42
}
})
```

### A More Complex Example
```js
const assert = require('assert')
const expressionToMongoQuery = require('expression2mongoquery')({
converters: {
birthDay: d => new Date(d),
}
})
const query = expressionToMongoQuery('name == "John" && (birthDay > "1990-05-02" || info.id in [1,2,3])')
assert.deepStrictEqual(query, {
name: 'John',
$or: [
{
birthDay: {
$gt: new Date('1990-05-02T00:00:00.000Z')
}
},
{
'info.id': {
$in: [1, 2, 3]
}
}
]
})
```

More examples can be found by consulting the test cases.

## Features
This library considers `identifiers` (variables) as document properties, while literal values are treated as values.

It supports:
- equal and not equal signs for direct equality comparisons
- equal and not equal to `undefined` translated as `$exists`
- inequalities such as `>` `<` `>=` and `<=` to `$gt` etc...
- `in` translated as `$in` for arrays (differently from JavasScript)
- logical `&&`, `||` and `!` operators to `$or`, `$and`, `$not`
- arbitrarly nested logical operators expressions
- parenthesized expressions
- composite identifiers to query nested documents i.e. `a.b["c"] > 3` becomes `{ 'a.b.c': { $gt: 3 } }`
- provide your favourite way to parse JavaScript in construction by passing `{ parseExpressionFunction: }`
- convert values according to the property name, by providing a `{ converters: { a: d => new Date(d) } }` map
- regexes: `a == /^c.*/i` becomes `{ a: /^c.*/i }`

## How does it work?
This library parses JavaScript expressions with `acorn` (by default), then navigates the generated `AST` to transform it into `mongo` queries.
The JavaScript code is never evaluated or executed, so there aren't vulnerabilities caused by JavaScript code injection.

## Parser libraries tested
Every test case has passed using all the following parsers:
- `acorn` (default)
- `babylon`
- `esprima`
- `espree`

Refer to tests to see how you can use the above parsers.