9.1.5 • Published 7 years ago
rurudb v9.1.5
ruruDB
Overview
RuruDB is a document database with basic features for prototyping purposes.
- Fully schema-based, with explicit field
typeanddefault- string
- boolean
- number
- string array
- boolean array
- number array
- Atomic database file saves
- Data is first written to
*-temp.rrdb - If
snapshotIntervalhas passed, copy*-current.rrdbto*-DATE_TIME-snapshot.rrdb - Stale data in
*-current.rrdbis transferred to*-old.rrdb - Data is finally written to
*-curent.rrdb
- Data is first written to
- Adaptive file loads
- Data is first checked at
*-curent.rrdb - If not found, we check at
*-temp.rrdb - If not found, we check at
*-old.rrdb
- Data is first checked at
Implementation Term Equivalents
| RuruDB | Google Datastore | MongoDB | MySQL |
|---|---|---|---|
| Table | Kind | Collection | Table |
| Item | Entity | Document | Row |
| Item ID | Key Name / Key ID | Document ID | Row Keys / ID |
| Item Field | Entity Property | Document Property | Row Column |
| Query | Query | Query | Query |
IMPORTANT
- This module uses
Object.freezefor immutability & performance - In JS engines, modifications made on frozen objects fail silently on non-strict mode
- Therefore you must add
'use strict';on your code to expose such errors - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
- For Babel users: https://babeljs.io/docs/en/next/babel-plugin-transform-strict-mode.html
Database
- constructor(options) => Database
options.logFunctionFunctionoptions.filenameStringoptions.directoryStringoptions.saveFormatStringjson,readable_json,msgpack
options.msgpackBufferSizeNumber Optionaloptions.snapshotIntervalString Optional
- async loadDatabaseFile() => undefined
- initTable(tableLabel, itemSchema, outdatedItemUpdater, shouldExist) => undefined
tableLabelStringitemSchemaObject SchemaoutdatedItemUpdaterFunctionshouldExistBoolean Optional
- initKVTable(tableLabel, shouldExist) => undefined
tableLabelStringshouldExistBoolean Optional
- async serve() => undefined
- getTable(tableLabel) => Table
tableLabelString
- getKVTable(tableLabel) => KVTable
tableLabelString
Example code
// db.js
const { Database } = require('rurudb');
const db = new Database({
filename: 'test',
directory: './temp',
saveFormat: 'readable_json',
logFunction: console.log,
});
module.exports = db;// initialize.js
const db = require('./db');
const initialize = async () => {
await db.loadDatabaseFile();
db.initTable(
'Members',
{
name: { type: 'string', default: '' },
age: { type: 'number', default: 0 },
onboarded: { type: 'boolean', default: false },
roles: { type: 'array', accept: 'string' },
},
() => {},
);
await db.serve();
};
module.exports = initialize;Table
- randomItemId() => String
- async insertItem(id, data, returnClone) => Item
idStringdataObjectreturnCloneBoolean Optional
- async updateItem(modifiedItem, returnClone) => Item
modifiedItemObjectreturnCloneBoolean Optional
- async updateItemById(id, data, returnClone) => Item
idStringdataObjectreturnCloneBoolean Optional
- async mergeItemById(id, data, returnClone) => Item
idStringdataObjectreturnCloneBoolean Optional
- async removeItem(item) => undefined
itemObject
- async removeItemById(id) => undefined
idString
- hasId(id) => Boolean
idString
- fetchItem(id, returnClone) => Item
idStringreturnCloneBoolean Optional
- async clear() => undefined
- async destroy() => undefined
- query() => Query
Table Notes
directorymust start with'./', ie'./temp'msgpackBufferSizeis required when usingmsgpackas value ofsaveFormatsnapshotIntervalis only triggered when database has been modified
KVTable
- async set(key, value) => undefined
keyStringvalueAny
- has(key) => boolean
keyString
- get(key) => Any
keyString
- async delete(key) => undefined
keyString
- asnyc clear() => undefined
- async destroy() => undefined
Query
- offset(value) => Query
valueNumber
- limit(value) => Query
valueNumber
- ascend(field) => Query
fieldString StringField NumberField
- descend(field) => Query
fieldString StringField NumberField
- ascendHaversine(field, latitude, longitude) => Query
fieldString StringField NumberArrayFieldlatitudeNumberlongitudeNumber
- descendHaversine(field, latitude, longitude) => Query
fieldString StringField NumberArrayFieldlatitudeNumberlongitudeNumber
- sortBy(sortFn) => Query
sortFnFunction
- gt(field, value) => Query
fieldString NumberFieldvalueNumber
- gte(field, value) => Query
fieldString NumberFieldvalueNumber
- lt(field, value) => Query
fieldString NumberFieldvalueNumber
- lte(field, value) => Query
fieldString NumberFieldvalueNumber
- eq(field, value) => Query
fieldString AnyFieldvalueAny
- neq(field, value) => Query
fieldString AnyFieldvalueAny
- has(field, value) => Query
fieldString ArrayFieldvalueAny
- hasAnyOf(field, values) => Query
fieldString ArrayFieldvaluesArray
- hasAllOf(field, values) => Query
fieldString ArrayFieldvaluesArray
- hasNoneOfAny(field, values) => Query
fieldString ArrayFieldvaluesArray
- hasNoneOfAll(field, values) => Query
fieldString ArrayFieldvaluesArray
- select(...fields) => Query
fieldsString StringFields
- hide(...fields) => Query
fieldsString StringFields
- filterBy(filterFn) => Query
filterFnFunction
- results(returnClone) => Array
returnCloneBoolean Optional
- firstResult(returnClone) => Item
returnCloneBoolean Optional
- hasResults(returnClone) => Boolean
returnCloneBoolean Optional
- countResults(returnClone) => Number
returnCloneBoolean Optional
Notes on filterBy(filterFn)
filterBy'sfilterFnmust accept(item: Item, id: string)and returnboolean- Check out
Array.filterat MDN for reference
- Check out
Notes on ascend(field), descend(field) and sortBy(sortFn)
- Sorts can be stacked, meaning you can sort by multiple fields easily
ascend&descendare designed for sorting ofstringandnumberfieldssortBy'ssortFnmust accept(a: Item, b: Item)and returnnumber- Check out
Array.sortat MDN for reference
- Check out
Notes on results(returnClone)
- Returned items are immutable / frozen objects, pass
returnClone=trueto return mutable objects - Modifying the results directly won't affect stored data, unless you use
Table.updateItem(item)on them
Changelog
- 1.x.x - 8.x.x
- Initial releases
- 9.0.0
- Refactor to Javascript from Typescript
- Fully schema-based
- Consistent & readable type-checks
- Use of frozen objects for immutability & performance
- Query helpers
- results()
- firstResult()
- hasResults()
- countResults()
- 9.1.x
Query.js: Add Haversine sort methods- Query().ascendHaversine(field, latitude, longitude);
- Query().descendHaversine(field, latitude, longitude);
validateSchema.js: Fix typosQuery.js: Schema-based type-checks onfieldparametersvalidateLoadedItem.js: Fix detection of unexpected keysDatabase.js: Make errors more verboseTable.js: Make errors more verbosevalidateInsertedUpdatedItem.js: Make errors more verbosevalidateLoadedItem.js: Make errors more verbosevalidateSchema.js: Make errors more verbose@9.1.3Query.js: Fixascend()anddescend()parameter type checks@9.1.3README.md: FixascendHaversine()anddescendHaversine()return values@9.1.4Table.js: Fix error verbosity by showing table names@9.1.5Table.js: FixinitKVTable()
MIT | @davalapar
9.1.5
7 years ago
9.1.4
7 years ago
9.1.3
7 years ago
9.1.2
7 years ago
9.1.1
7 years ago
9.1.0
7 years ago
9.0.0
7 years ago
8.0.2
7 years ago
8.0.1
7 years ago
8.0.0
7 years ago
7.0.1
7 years ago
7.0.0
7 years ago
6.4.0
7 years ago
6.3.0
7 years ago
6.2.0
7 years ago
6.1.0
7 years ago
6.0.0
7 years ago
5.0.1
7 years ago
5.0.0
7 years ago
4.2.0
7 years ago
4.1.0
7 years ago
4.0.0
7 years ago
3.0.0
7 years ago
2.2.2
7 years ago
2.2.1
7 years ago
2.2.0
7 years ago
2.1.0
7 years ago
2.0.0
7 years ago
1.0.1
7 years ago
1.0.0
7 years ago