array-aggregate

Mongo-like aggregate for arrays

Usage no npm install needed!

<script type="module">
  import arrayAggregate from 'https://cdn.skypack.dev/array-aggregate';
</script>

README

array-aggregate - Mongo-like querying and filtration

CircleCIcodecov

Installation

yarn add array-aggregate

Usage

import { makeQueryFilter } from 'array-aggregate'

const filterFn = makeQueryFilter({
  tags: 'bar',
  'history.creator': 1 // User Id
})

console.log(filterFn.match({
  tags: ['foo', 'bar', 'etc'],
  history: [
    {
      creator: 0
    },
    {
      creator: 1
    }
  ]
})) // true

console.log(filterFn.match({
  tags: ['foo', 'etc'],
  history: [
    {
      creator: 0
    },
    {
      creator: 1
    }
  ]
})) // false

console.log(filterFn.match({
  tags: ['foo', 'bar', 'etc'],
  history: [
    {
      creator: 0
    }
  ]
})) // false

Built-in operators

$eq

Check that value is equal to some in query. Work with array, string, number, Date, boolean

$gt

Check that value is greater than some in query. Work with number, Date

$gte

Check that value is greater than or equal some in query. Work with number, Date

$lt

Check that value is less than some in query. Work with number, Date

$lte

Check that value is less than or equal some in query. Work with number, Date

$ne

Check that value is not equal some in query. Work with array, string, number, Date, boolean

$in

Check that value is a member of some in query. Work with array, string, number

$nin

Check that value is not a member of some in query. Work with array, string, number

Built-in logical Operators

$and

Check that all matches are true

$or

Check that at least one matches are true

$nor

Check that all matches are false

$not

Negotiate inner condition result

Built-in element Operators

$exists

If it's true we will check that needed field exists in object, if it's false we will check that needed field is not inside object

Array Operators

$all

Check that all elements from rule are present in value.

$size

Check that array or string have needed length

$elemMatch

Apply some rule to array elements

Big query example

import { makeQueryFilter } from 'array-aggregate'

const secondQuery = makeQueryFilter({
  foo: {
    $eq: 'bar',
    $exists: true
  },
  createdAt,
  ololo: {
    a: {
      $exists: false
    }
  },
  a: {
    b: {
      c: {
        $lte: 1
      }
    }
  },
  'a[0].b.c': { // We can use path for accesing fields with index selection if it's needed
    $gte: 1
  }
})

console.log(secondQuery.match({
  foo: ['bar', 'test'],
  createdAt,
  a: [{
    b: [{
      c: 1
    }]
  }]
})) // true