Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pixiedevpraveen/pixiedb
A tiny in-memory javascript database with indexing and sql like filters.A small javascript in memory database with indexing and filters.
https://github.com/pixiedevpraveen/pixiedb
database in-memory-database in-memory-storage javascript-database js-database small-database
Last synced: about 2 months ago
JSON representation
A tiny in-memory javascript database with indexing and sql like filters.A small javascript in memory database with indexing and filters.
- Host: GitHub
- URL: https://github.com/pixiedevpraveen/pixiedb
- Owner: pixiedevpraveen
- License: mit
- Created: 2024-03-03T21:42:06.000Z (10 months ago)
- Default Branch: master
- Last Pushed: 2024-03-27T00:02:56.000Z (10 months ago)
- Last Synced: 2024-10-02T02:57:52.356Z (3 months ago)
- Topics: database, in-memory-database, in-memory-storage, javascript-database, js-database, small-database
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/pixiedb
- Size: 42 KB
- Stars: 0
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PixieDB
[![npm version][npm-version-src]][npm-version-href]
[![npm downloads][npm-downloads-src]][npm-downloads-href]
[![bundle][bundle-src]][bundle-href]
[![JSDocs][jsdocs-src]][jsdocs-href]
[![License][license-src]][license-href]A tiny in-memory javascript database with indexing and sql like filters.
PixieDb perform all operations (insert, delete, get) in log(n) time.
> [!WARNING]
> Please keep in mind that PixieDb is still in under active development.## Usage
```ts
import { PixieDb } from "pixiedb";const products = [
{ id: 1, name: "Apple", price: 5, category: "Fruit" },
{ id: 2, name: "Banana", price: 10, category: "Fruit" },
{ id: 3, name: "Grapes", price: 6, category: "Fruit" },
{ id: 4, name: "Orange", price: 8, category: "Fruit" },
{ id: 5, name: "Potato", price: 18, category: "Vegetable" },
{ id: 6, name: "Milk", price: 7, category: "Dairy" },
// ...
]// provide unique key, data and indexes for better performance
// 3rd param data is optional can be load after using the load method
const pd = new PixieDb('id', ["price", "category"], products)
// or
const pd = new PixieDb('id', ["price", "category"]) // pass type if using typescript
pd.load(products) // to load data laterconst byId = pd.select().eq("id", 2).single()
console.log(byId); // { id: 2, name: "Banana", price: 10, category: "Fruit" }// can also pass array of fields to select method to pick only those fields/properties
const fruitBelow10 = pd.select(["id", "name", "price"]).eq("category", "Fruit").lte("price", 10).orderBy(["name", ["price", "desc"]]).range(2, 3).data()
console.log(fruitBelow10); // [{ id: 3, name: "Grapes", price: 6 }, ...]const updatedBanana = pd.where().eq("name", "Banana").update({price: 100})
// [{ id: 2, name: "Banana", price: 100, category: "Fruit" }, ...]// delete all docs where name equals "Apple"
const deletedApples = pd.where().eq("name", "Apple").delete()
// [{ id: 1, name: "Apple", price: 5, category: "Fruit"}, ...]
```[npm-version-src]: https://img.shields.io/npm/v/pixiedb?style=flat&colorA=080f12&colorB=1fa669
[npm-version-href]: https://npmjs.com/package/pixiedb
[npm-downloads-src]: https://img.shields.io/npm/dm/pixiedb?style=flat&colorA=080f12&colorB=1fa669
[npm-downloads-href]: https://npmjs.com/package/pixiedb
[bundle-src]: https://img.shields.io/bundlephobia/minzip/pixiedb?style=flat&colorA=080f12&colorB=1fa669&label=minzip
[bundle-href]: https://bundlephobia.com/result?p=pixiedb
[license-src]: https://img.shields.io/github/license/pixiedevpraveen/pixiedb.svg?style=flat&colorA=080f12&colorB=1fa669
[license-href]: https://github.com/pixiedevpraveen/pixiedb/blob/main/LICENSE
[jsdocs-src]: https://img.shields.io/badge/jsdocs-reference-080f12?style=flat&colorA=080f12&colorB=1fa669
[jsdocs-href]: https://www.jsdocs.io/package/pixiedb## Installation
```bash
# using npm
npm install pixiedb# using pnpm
pnpm add pixiedb# using yarn
yarn add pixiedb# using bun
bun add pixiedb
```## Docs
### PixieDb
This is a class which create an PixieDb instance to use.```ts
// pass type/interface if using typescript
const pd = new PixieDb('id', ["price", "category"])// or with data
const pd = new PixieDb('id', ["price", "category"], products)
```### Methods
#### load
Used to import data without cloning (so don't mutate the data or clone before load).
Pass true as second parameter to clear the previous data and indexes state. (default: false).```ts
pd.load(products)
// or
pd.load(products, true)
// remove previous data and index state
```#### get
Get single doc/row using key (primary key/unique id).
Returns doc/row if present else undefined.```ts
pd.get(2)
// { id: 2, name: "Banana", price: 10, category: "Fruit" }
```#### select
Get single doc/row using key (primary key/unique id).
Returns doc/row if present else undefined.```ts
pd.select().eq("category", "Fruit").gte("price", 6).data()
// [{ id: 2, name: "Banana", price: 10, category: "Fruit" }, { id: 3, name: "Grapes", price: 6, category: "Fruit" }, ...]pd.select(["id", "name", "price"]).eq("category", "Fruit").lte("price", 6).data()
// [{ id: 1, name: "Apple", price: 5 }, ...]pd.select().eq("category", "Fruit").between("price", [6, 10]).data()
// [{ id: 2, name: "Banana", price: 10, category: "Fruit" }, { id: 3, name: "Grapes", price: 6, category: "Fruit" }, { id: 4, name: "Orange", price: 8, category: "Fruit" }, ...]
```#### where
used to perform delete/update with complex filtering
```ts
// this will delete and return all the docs according to the filters
pd.where().eq("category", "Fruit").gte("price", 6).delete()
// [{ id: 2, name: "Banana", price: 10, category: "Fruit" }, { id: 3, name: "Grapes", price: 6, category: "Fruit" }, ...]pd.where().eq("category", "Fruit").between("price", [6, 10]).update({price: 11})
// [{ id: 2, name: "Banana", price: 11, category: "Fruit" }, { id: 3, name: "Grapes", price: 11, category: "Fruit" }, { id: 4, name: "Orange", price: 11, category: "Fruit" }, ...]
```#### data
Get all docs/rows ordered respect to primary key/unique id.
Pass false to get all without clone (don't modify). default: true
```ts
pd.data()
// [{ id: 1, name: "Apple", price: 5, category: "Fruit" }, ...]
```#### count
Get all docs/rows ordered respect to primary key/unique id.
Pass false to get all without clone (don't modify). default: true
```ts
pd.select().count()
// 6pd.select().eq("category", "Fruit").between("price", [6, 10]).count()
// 4
```#### close
to close/quit/terminate the database and remove all data/indexes and fire "Q" ("quit") event.
Pass true to not emit events. default: false
```ts
pd.close()
// or
pd.close(true) // doesn't fire event
```#### toJson
return JSON of all data (without cloning), key and index names.
```ts
pd.toJSON()
// { key: "id", indexes: ["price", "category", {name: "id", unique: true}], data: [{ id: 1, name: "Apple", price: 10, category: "Fruit" }, ...]// this will call the above toJSON method
JSON.stringify(pd)
```[view more](https://github.com/pixiedevpraveen/pixiedb/tree/master/README.md)
## Roadmap
- [X] load docs
- [X] get all docs
- [X] get docs with key
- [X] Events (load, change, insert, update, delete, quit)
- [X] orderBy with multiple keys (sorting)
- [X] single doc with filters
- [X] count of docs with filters
- [X] update of docs with filters
- [X] delete of docs with filters
- [X] filters
- [X] eq (where value equal)
- [X] neq (where value not equal)
- [X] in (where value in)
- [X] nin (where value not in)
- [X] between (where value between to values)
- [X] nbetween (where value not between to values)
- [X] gt (where value greater than)
- [X] gte (where value greater than or equal to)
- [X] lt (where value less than)
- [X] lte (where value less than or equal to)
- [ ] custom query method
- [X] range offset (from) and count (limit of docs to return)