https://github.com/synatic/noql
Converts SQL queries into MongoDB queries or aggregation pipelines
https://github.com/synatic/noql
javascript mongodb postgres query sql
Last synced: 10 days ago
JSON representation
Converts SQL queries into MongoDB queries or aggregation pipelines
- Host: GitHub
- URL: https://github.com/synatic/noql
- Owner: synatic
- License: gpl-3.0
- Created: 2021-03-02T07:16:11.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-02-19T12:55:29.000Z (about 2 months ago)
- Last Synced: 2025-03-30T11:33:46.818Z (16 days ago)
- Topics: javascript, mongodb, postgres, query, sql
- Language: JavaScript
- Homepage: https://noql.synatic.dev/
- Size: 7.11 MB
- Stars: 51
- Watchers: 5
- Forks: 12
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
- awesome-github-star - noql
README
# NoQL - Not Only SQL

NoQL Converts SQL statements to Mongo find statements or aggregation pipelines. NoQL supports mySQL and Postgres Syntax, and generates Mongo 3.6 or greater compatible queries.
For full docs and a playground to try NoQL out, visit [https://noql.synatic.dev/](https://noql.synatic.dev/)
## Installation
Install NoQL using the [npm install command](https://docs.npmjs.com/downloading-and-installing-packages-locally):
```bash
npm i @synatic/noql
```## Usage
NoQL outputs an object with the type, either `query` or `aggregate`, along with the components of the Mongo query. To use the output object, construct a query with `MongoClient` from the [MongoDB NodeJS Driver](https://www.npmjs.com/package/mongodb):
```js
const SQLParser = require('@synatic/noql');
const {MongoClient} = require('mongodb');(async () => {
try {
client = new MongoClient('mongodb://127.0.0.1:27017');
await client.connect();
const db = client.db('noql-test');const parsedSQL = SQLParser.parseSQL('select id from `films` limit 10');
if (parsedSQL.type === 'query') {
console.log(
await db
.collection(parsedSQL.collection)
.find(parsedSQL.query || {}, parsedSQL.projection || {})
.limit(parsedSQL.limit || 50)
.toArray()
);
} else if (parsedSQL.type === 'aggregate') {
console.log(
await db
.collection(parsedSQL.collections[0])
.aggregate(parsedSQL.pipeline)
.toArray()
);
}
} catch (exp) {
console.error(exp);
}
})();
```## NoQL Output Examples
NoQL outputs an object with the type, either `query` or `aggregate`, along with the components of the Mongo query. Here are some examples of the output:
For a straight query:
```js
SQLMongoParser.parseSQL('select id from `films` where `id` > 10 limit 10');
```NoQL will output:
```json
{
"limit": 10,
"collection": "films",
"projection": {
"id": "$id"
},
"query": {
"id": {
"$gt": 10
}
},
"type": "query"
}
```For an aggregate query:
```js
SQLMongoParser.makeMongoAggregate(
'select id from `films` where `id` > 10 group by id'
);
```NoQL will output:
```json
{
"pipeline": [
{
"$match": {
"id": {
"$gt": 10
}
}
},
{
"$group": {
"_id": {
"id": "$id"
}
}
},
{
"$project": {
"id": "$_id.id",
"_id": 0
}
}
],
"collections": ["films"]
}
```## Currently Unsupported SQL Statements
- Over
- CTE's
- Pivot
- UnionSee more in the full docs at [https://noql.synatic.dev/](https://noql.synatic.dev/)