0.7.1 • Published 1 year ago
mql-match v0.7.1
mql-match
This project is a MQL (MongoDB Query Language) compiler. Filter, Update, and Aggregation queries are supported. See the support table table for more info.
Why
This project can be useful to mock some basic functionality of MongoDB's driver or simply using its query syntax for object matching.
Example
import { ObjectId } from 'bson' // or 'mongodb'
import {
compileAggregationExpression,
compileAggregationPipeline,
compileFilterQuery,
compileUpdateQuery
} from 'mql-match'
const documents = [
{
_id: new ObjectId("507f1f77bcf86cd799439011"),
value: 130
},
{
_id: new ObjectId("507f191e810c19729de860ea"),
value: 42
}
]
const match = compileFilterQuery({
_id: new ObjectId("507f1f77bcf86cd799439011")
})
// logs { _id: new ObjectId("507f1f77bcf86cd799439011"), value: 130 }
console.log(documents.find(match))
const update = compileUpdateQuery({
$setOnInsert: {
hello: 'World'
},
$set: {
my: 'Pleasure'
}
})
const oldObject = { _id: "my_doc" }
update(oldObject)
// logs { _id: 'my_doc', my: 'Pleasure' }
console.log(oldObject)
const newObject = {}
// the `true` say that this document was inserted
update(newObject, true)
// logs { _id: new ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"), hello: 'World', my: 'Pleasure' }
console.log(newObject)
const map = compileAggregationExpression({
_id: 0,
item: 1,
discount: {
$cond: {
if: { $gte: ['$qty', 250] },
then: 30,
else: 20
}
}
})
// logs { item: 'xyz1', discount: 30 }
console.log(map({ _id: 3, item: 'xyz1', qty: 250 }))
// Returns a function that accepts an iterable (both sync or async) and returns an async iterable
const aggregate = compileAggregationPipeline([
{
$match: {
value: 42
}
}
])
async function pipelineExample () {
// logs { _id: new ObjectId("507f191e810c19729de860ea"), value: 42 }
for await (const document of aggregate(documents)) {
console.log(document)
}
}
pipelineExample().catch(err => console.error(err))
Supported features
Query Operators
Comparison
Logical
Element
Evaluation
Geospatial
Array
Bitwise
Projection
Miscellaneous
Update Operators
Fields
Array
Modifiers
Bitwise
Aggregation Pipeline Stages
$addFields
$bucket
$bucketAuto
$changeStream
$collStats
$count
$currentOp
$densify
$documents
$facet
$fill
$geoNear
$graphLookup
$group
$indexStats
$limit
$listLocalSessions
$listSessions
$lookup
$match
$merge
$out
$planCacheStats
$project
$redact
$replaceRoot
$replaceWith
$sample
$search
$searchMeta
$set
$setWindowFields
$skip
$sort
$sortByCount
$unionWith
$unset
$unwind
Aggregation Variables
$$NOW
$$CLUSTER_TIME
$$ROOT
$$CURRENT
$$REMOVE
$$DESCEND
$$PRUNE
Aggregation Pipeline Operators
Operators not listed here are currently not supported. Feel free to open an GitHub Issue if you need something in particular.
Arithmetic Expression Operators
Array Expression Operators
$arrayElemAt
$arrayToObject
$concatArrays
$filter
$first
$firstN
$in
$indexOfArray
$isArray
$last
$lastN
$map
$maxN
$minN
$objectToArray
$range
$reduce
$reverseArray
$size
$slice
$sortArray
$zip
Boolean Expression Operators
Comparison Expression Operators
Conditional Expression Operators
Custom Aggregation Expression Operators
Data Size Operators
Date Expression Operators
$dateAdd
$dateDiff
$dateFromParts
$dateFromString
$dateSubtract
$dateToParts
$dateToString
$dateTrunc
$dayOfMonth
$dayOfWeek
$dayOfYear
$hour
$isoDayOfWeek
$isoWeek
$isoWeekYear
$millisecond
$minute
$month
$second
$toDate
$week
$year
Literal Expression Operator
$literal
No validation.
Miscellaneous Operators
Object Expression Operators
Set Expression Operators
String Expression Operators
$concat
$dateFromString
$dateToString
$indexOfBytes
$indexOfCP
$ltrim
$regexFind
$regexFindAll
$regexMatch
$replaceOne
$replaceAll
$rtrim
$split
$strLenBytes
$strLenCP
$strcasecmp
$substr
$substrBytes
$substrCP
$toLower
$toString
$trim
$toUpper
Text Expression Operator
Timestamp Expression Operators
Trigonometry Expression Operators
$sin
$cos
$tan
$asin
$acos
$atan
$atan2
$asinh
$acosh
$atanh
$sinh
$cosh
$tanh
$degreesToRadians
$radiansToDegrees
Type Expression Operators
$convert
$isNumber
$toBool
$toDate
$toDecimal
$toDouble
$toInt
$toLong
$toObjectId
$toString
$type
Adds"unknown"
type.
Support
If this library helps you in your organization, you can show some love by giving the repo a star or support by making a nominal monetary contribution.