{"id":20716532,"url":"https://github.com/akira-cn/okeydb","last_synced_at":"2025-07-08T07:34:43.262Z","repository":{"id":176573919,"uuid":"656540455","full_name":"akira-cn/okeydb","owner":"akira-cn","description":"Pure JavaScript NoSQL database with no dependency, written by node.js.","archived":false,"fork":false,"pushed_at":"2023-09-12T02:15:52.000Z","size":128,"stargazers_count":34,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-23T13:24:38.265Z","etag":null,"topics":["database","indexeddb","json","nodejs","nosql","nosql-database"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akira-cn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-06-21T06:45:24.000Z","updated_at":"2025-02-21T00:55:28.000Z","dependencies_parsed_at":"2025-04-23T13:21:12.283Z","dependency_job_id":null,"html_url":"https://github.com/akira-cn/okeydb","commit_stats":null,"previous_names":["akira-cn/airdb-lite","akira-cn/airdb"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/akira-cn/okeydb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fokeydb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fokeydb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fokeydb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fokeydb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akira-cn","download_url":"https://codeload.github.com/akira-cn/okeydb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fokeydb/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264222207,"owners_count":23575199,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","indexeddb","json","nodejs","nosql","nosql-database"],"created_at":"2024-11-17T03:06:01.609Z","updated_at":"2025-07-08T07:34:43.192Z","avatar_url":"https://github.com/akira-cn.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OkeyDB\n\nOkeyDB is a light-weight document oriented NoSQL database based on local file-system and [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API).\n\nPure JavaScript NoSQL database with no dependency. IndexedDB, Flat file, JSON based document database, running in Web Browser and Node.js.\n\n**Its api is compatible with the [aircode database API](https://docs.aircode.io/reference/server/database-api).**\n\n## Features\n\n- Available in Web Browser and Node.js.\n- Use IndexedDB in Web Browser.\n- Use JSON file storage in Node.js, no need to install any database.\n- A convenient and easy-to-use chained API that returns Promises.\n- Powerful combined conditional queries.\n\n## Usage\n\n### In Web Browser\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n  \u003ctitle\u003eDocument\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cscript type=\"module\"\u003e\n    import { OkeyDB } from 'https://unpkg.com/okeydb/dist/okeydb.browser.mjs';\n\n    function* pollItem(array) {\n      let current = 0;\n      while(true) {\n        yield array[current++ % array.length];\n      }\n    }\n\n    const db = new OkeyDB();\n    const table = db.table('employees');\n\n    await table.where().delete();\n    const genTeam = pollItem(['juejin', 'segmentfault', 'aircode']);\n    const genPosition = pollItem(['developer', 'designer', 'manager', 'intern']);\n\n    const employees = [];\n    for(let i = 0; i \u003c 10; i++) {\n      employees.push({\n        id: i,\n        team: genTeam.next().value, \n        position: genPosition.next().value,\n        age: 20 + i * 2,\n        avaliablePositions: ['developer', 'designer', 'manager', 'intern'],\n      });\n    }\n    await table.save(employees);\n\n    console.table(await table.where({team: 'juejin'}).find());\n  \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n### In Node.js\n\n```js\nimport {OkeyDB} from 'okeydb';\n\nconst db = new OkeyDB();\nconst personTable = db.table('person');\nconst students = [];\n\nfunction randomScore(low = 0, high = 100) {\n  return low + Math.floor(Math.random() * (high - low + 1));\n}\n\nfor(let i = 0; i \u003c 1000; i++) {\n  const student = {name: `student${i}`, score: randomScore()};\n  students.push(student);\n}\nawait personTable.save(students);\n\n// find all students that score \u003e= 60\nconst result = await personTable.where({score: db.gte(60)}).find();\nconsole.log(result);\n```\n\n### Database API\n\n- [Table](https://docs.aircode.io/reference/server/database-api#table)\n  - [db.table(tableName)](https://docs.aircode.io/reference/server/database-api#db-table-tablename)\n  - [Table.save(record | arrayOfRecords)](https://docs.aircode.io/reference/server/database-api#table-save-record-arrayofrecords)\n  - [Table.delete(record | arrayOfRecords)](https://docs.aircode.io/reference/server/database-api#table-delete-record-arrayofrecords)\n  - [Table.where([conditions])](https://docs.aircode.io/reference/server/database-api#table-where-conditions)\n- [Query Commands](https://docs.aircode.io/reference/server/database-api#query-commands)\n  - [Query.find()](https://docs.aircode.io/reference/server/database-api#query-find)\n  - [Query.findOne()](https://docs.aircode.io/reference/server/database-api#query-findone)\n  - [Query.count()](https://docs.aircode.io/reference/server/database-api#query-count)\n  - [Query.save()](https://docs.aircode.io/reference/server/database-api#query-save)\n  - [Query.delete()](https://docs.aircode.io/reference/server/database-api#query-delete)\n- [Sort and Pagination Chain](https://docs.aircode.io/reference/server/database-api#sort-and-pagination-chain)\n  - [Query.sort(conditions)](https://docs.aircode.io/reference/server/database-api#query-sort-conditions)\n  - [Query.skip(n)](https://docs.aircode.io/reference/server/database-api#query-skip-n)\n  - [Query.limit(n)](https://docs.aircode.io/reference/server/database-api#query-limit-n)\n- [Projection Chain](https://docs.aircode.io/reference/server/database-api#projection-chain)\n  - [Query.projection(conditions)](https://docs.aircode.io/reference/server/database-api#query-projection-conditions)\n- [Update Chain](https://docs.aircode.io/reference/server/database-api#update-chain)\n  - [Query.set(conditions)](https://docs.aircode.io/reference/server/database-api#query-set-conditions)\n  - [Query.upsert([boolean=true])](https://docs.aircode.io/reference/server/database-api#query-upsert-boolean-true)\n  - [Query.setOnInsert(object)](https://docs.aircode.io/reference/server/database-api#query-setoninsert-object)\n- [Logical Chain](https://docs.aircode.io/reference/server/database-api#logical-chain)\n  - [Query.and(...filters)](https://docs.aircode.io/reference/server/database-api#query-and-filters)\n  - [Query.or(...filters)](https://docs.aircode.io/reference/server/database-api#query-or-filters)\n  - [Query.nor(...filters)](https://docs.aircode.io/reference/server/database-api#query-nor-filters)\n- [Comparison Operators](https://docs.aircode.io/reference/server/database-api#comparison-operators)\n  - [db.gt(value)](https://docs.aircode.io/reference/server/database-api#db-gt-value)\n  - [db.gte(value)](https://docs.aircode.io/reference/server/database-api#db-gte-value)\n  - [db.lt(value)](https://docs.aircode.io/reference/server/database-api#db-lt-value)\n  - [db.lte(value)](https://docs.aircode.io/reference/server/database-api#db-lte-value)\n  - [db.ne(value)](https://docs.aircode.io/reference/server/database-api#db-ne-value)\n  - [db.in(array)](https://docs.aircode.io/reference/server/database-api#db-in-array)\n  - [db.nin(array)](https://docs.aircode.io/reference/server/database-api#db-nin-array)\n- [Element Operators](https://docs.aircode.io/reference/server/database-api#element-operators)\n  - [db.exists(boolean)](https://docs.aircode.io/reference/server/database-api#db-exists-boolean)\n  - [db.type(typeString)](https://docs.aircode.io/reference/server/database-api#db-type-typestring)\n- [Evaluation Operators](https://docs.aircode.io/reference/server/database-api#evaluation-operators)\n  - [db.mod(divisor, remainder)](https://docs.aircode.io/reference/server/database-api#db-mod-divisor-remainder)\n- [Array Operators](https://docs.aircode.io/reference/server/database-api#array-operators)\n  - [db.all(array)](https://docs.aircode.io/reference/server/database-api#db-all-array)\n  - [db.elemMatch(conditions)](https://docs.aircode.io/reference/server/database-api#db-elemmatch-conditions)\n  - [db.size(n)](https://docs.aircode.io/reference/server/database-api#db-size-n)\n- [Bitwise Operators](https://docs.aircode.io/reference/server/database-api#bitwise-operators)\n  - [db.bitsAllClear(positions)](https://docs.aircode.io/reference/server/database-api#db-bitsallclear-positions)\n  - [db.bitsAllSet(positions)](https://docs.aircode.io/reference/server/database-api#db-bitsallset-positions)\n  - [db.bitsAnyClear(positions)](https://docs.aircode.io/reference/server/database-api#db-bitsanyclear-positions)\n  - [db.bitsAnySet(positions)](https://docs.aircode.io/reference/server/database-api#db-bitsanyset-positions)\n- ~~Geospatial Objects~~\n  - ~~Point~~\n  - ~~LineString~~\n  - ~~Polygon~~\n  - ~~MultiPoint~~\n  - ~~MultiLineString~~\n  - ~~MultiPolygon~~\n  - ~~GeometryCollection~~\n- ~~Geospatial Operators~~\n  - ~~db.geoIntersects(conditions)~~\n  - ~~db.geoWithin(conditions)~~\n  - ~~db.near(conditions)~~\n  - ~~db.nearSphere(conditions)~~\n- [Update Operators](https://docs.aircode.io/reference/server/database-api#update-operators)\n  - [db.inc(value)](https://docs.aircode.io/reference/server/database-api#db-inc-value)\n  - [db.mul(value)](https://docs.aircode.io/reference/server/database-api#db-mul-value)\n  - [db.min(value)](https://docs.aircode.io/reference/server/database-api#db-min-value)\n  - [db.max(value)](https://docs.aircode.io/reference/server/database-api#db-max-value)\n  - [db.rename(name)](https://docs.aircode.io/reference/server/database-api#db-rename-name)\n  - [db.unset()](https://docs.aircode.io/reference/server/database-api#db-unset)\n  - [db.currentDate()](https://docs.aircode.io/reference/server/database-api#db-currentdate)\n- [Logical Operators](https://docs.aircode.io/reference/server/database-api#logical-operators)\n  - [db.and(...filters)](https://docs.aircode.io/reference/server/database-api#db-and-filters)\n  - [db.or(...filters)](https://docs.aircode.io/reference/server/database-api#db-or-filters)\n  - [db.nor(...filters)](https://docs.aircode.io/reference/server/database-api#db-nor-filters)\n  - [db.not(condition)](https://docs.aircode.io/reference/server/database-api#db-not-condition)\n\n## Limits\n\nYou can use OkeyDB in your web app as client database. \n\n- **But due to the following reasons, it is NOT recommended for use in a Node.js production environment:**\n  - This is just a single-instance text database and does not have the ability to scale across multiple servers.\n  - Without using schema constraints and indexes(not implemented yet), the storage performance is limited by the usage of JSON.parse and JSON.stringify. Additionally, the query efficiency is limited by the size of the data.  \n\nIf you want to deploy your code to a production environment, you can seamlessly migrate to [AirCode](https://aircode.io/) and use `aircode.db`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakira-cn%2Fokeydb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakira-cn%2Fokeydb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakira-cn%2Fokeydb/lists"}