Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/paolosarti/expression2mongoquery
- Owner: PaoloSarti
- License: mit
- Created: 2018-10-13T18:00:26.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-03-02T10:36:12.000Z (almost 2 years ago)
- Last Synced: 2024-10-09T14:46:37.754Z (3 months ago)
- Language: JavaScript
- Homepage:
- Size: 887 KB
- Stars: 5
- Watchers: 3
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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.