Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nitrite/nitrite-java
NoSQL embedded document store for Java
https://github.com/nitrite/nitrite-java
android database documentdb embedded-database mobile-database nosql object-database object-storage
Last synced: 18 days ago
JSON representation
NoSQL embedded document store for Java
- Host: GitHub
- URL: https://github.com/nitrite/nitrite-java
- Owner: nitrite
- License: apache-2.0
- Created: 2017-04-19T18:26:54.000Z (over 7 years ago)
- Default Branch: main
- Last Pushed: 2024-10-29T16:36:21.000Z (about 2 months ago)
- Last Synced: 2024-10-29T23:35:55.445Z (about 2 months ago)
- Topics: android, database, documentdb, embedded-database, mobile-database, nosql, object-database, object-storage
- Language: Java
- Homepage: https://bit.ly/no2db
- Size: 5.19 MB
- Stars: 835
- Watchers: 27
- Forks: 95
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
- Security: SECURITY.md
Awesome Lists containing this project
- awesome-android - Nitrite Database - A NoSQL embedded document store for Android with MongoDb like API. (Libraries / Database)
README
# Nitrite Database
[![Build](https://github.com/nitrite/nitrite-java/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/nitrite/nitrite-java/actions/workflows/build.yml)
[![CodeQL](https://github.com/nitrite/nitrite-java/actions/workflows/codeql-analysis.yml/badge.svg?branch=main)](https://github.com/nitrite/nitrite-java/actions/workflows/codeql-analysis.yml)
[![codecov](https://codecov.io/gh/nitrite/nitrite-java/branch/main/graph/badge.svg)](https://codecov.io/gh/nitrite/nitrite-java)
[![javadoc](https://javadoc.io/badge2/org.dizitart/nitrite/javadoc.svg)](https://javadoc.io/doc/org.dizitart/nitrite)
[![Discussion](https://img.shields.io/badge/chat-Discussion-blueviolet)](https://github.com/orgs/nitrite/discussions)
**NO**sql **O**bject (**NO2** a.k.a Nitrite) database is an open source nosql embedded
document store. It supports both in-memory and file based persistent store.Nitrite is an embedded database ideal for desktop, mobile or small web applications.
**It features**:
- Embedded, serverless
- Simple API
- Document-oriented
- Schemaless document collection and object repository
- Extensible storage engines - mvstore, rocksdb
- Indexing and full-text search
- Simple query api
- In-memory and file-based store
- Transaction support
- Schema migration support
- Encryption support
- Android compatibility (API Level 24)## Kotlin Extension
Nitrite has a kotlin extension called **Potassium Nitrite** for kotlin developers.
Visit [here](https://github.com/nitrite/nitrite-java/tree/main/potassium-nitrite) for more details.## Flutter Version
If you are looking for Nitrite for Flutter/Dart, head over to [nitrite-flutter](https://github.com/nitrite/nitrite-flutter).
## Deprecation Notice
Nitrite DataGate and Nitrite Explorer is now deprecated and no longer maintained.
## Getting Started with Nitrite
**NOTE:** There are breaking api changes in version 4.x. So please read the [guide](https://nitrite.dizitart.com/java-sdk/getting-started/index.html) before upgrading from 3.x.x.
### How To Install
To use Nitrite in any Java application, first add the nitrite bill of materials, then add required dependencies:
**Maven**
```xml
org.dizitart
nitrite-bom
[latest version]
import
pom
org.dizitart
nitrite
org.dizitart
nitrite-mvstore-adapter
```
**Gradle**```groovy
implementation(platform("org.dizitart:nitrite-bom:[latest version]"))
implementation 'org.dizitart:nitrite'
implementation 'org.dizitart:nitrite-mvstore-adapter'```
## ExamplesA Todo android application is available [here](https://github.com/nitrite/nitrite-android-demo) to demonstrate the usage of Nitrite in android.
### Quick Examples
**Initialize Database**
```java
// create a mvstore backed storage module
MVStoreModule storeModule = MVStoreModule.withConfig()
.filePath("/tmp/test.db")
.compress(true)
.build();// or a rocksdb based storage module
RocksDBModule storeModule = RocksDBModule.withConfig()
.filePath("/tmp/test.db")
.build();// initialization using builder
Nitrite db = Nitrite.builder()
.loadModule(storeModule)
.loadModule(new JacksonMapperModule()) // optional
.openOrCreate("user", "password");```
**Create a Collection**
```java
// Create a Nitrite Collection
NitriteCollection collection = db.getCollection("test");// Create an Object Repository
ObjectRepository repository = db.getRepository(Employee.class);```
**Annotations for POJO**
```java
@Entity(value = "retired-employee", // entity name (optional),
indices = {
@Index(value = "firstName", type = IndexType.NON_UNIQUE),
@Index(value = "lastName", type = IndexType.NON_UNIQUE),
@Index(value = "note", type = IndexType.FULL_TEXT),
})
public class Employee implements Serializable {
// provides id field to uniquely identify an object inside an ObjectRepository
@Id
private long empId;
private Date joinDate;
private String firstName;
private String lastName;
private String note;// ... public getters and setters
}```
**CRUD Operations**
```java
// create a document to populate data
Document doc = Document.createDocument("firstName", "John")
.put("lastName", "Doe")
.put("birthDay", new Date())
.put("data", new byte[] {1, 2, 3})
.put("fruits", new ArrayList() {{ add("apple"); add("orange"); add("banana"); }})
.put("note", "a quick brown fox jump over the lazy dog");// insert the document
collection.insert(doc);// find a document
collection.find(where("firstName").eq("John").and(where("lastName").eq("Doe"));// update the document
collection.update(where("firstName").eq("John"), createDocument("lastName", "Wick"));// remove the document
collection.remove(doc);// insert an object in repository
Employee emp = new Employee();
emp.setEmpId(124589);
emp.setFirstName("John");
emp.setLastName("Doe");repository.insert(emp);
```
**Create Indices**
```java
// create document index
collection.createIndex(indexOptions(IndexType.NON_UNIQUE), "firstName", "lastName"); // compound index
collection.createIndex(indexOptions(IndexType.FULL_TEXT), "note"); // full-text index// create object index. It can also be provided via annotation
repository.createIndex(indexOptions(IndexType.NON_UNIQUE), "firstName");```
**Query a Collection**
```java
DocumentCursor cursor = collection.find(
where("firstName").eq("John") // firstName == John
.and(
where("data").elemMatch("$".lt(4)) // AND elements of data array is less than 4
.and(
where("note").text("quick") // AND note field contains string 'quick' using full-text index
)
)
);for (Document document : cursor) {
// process the document
}// get document by id
Document document = collection.getById(nitriteId);// query an object repository and create the first result
Cursor cursor = repository.find(where("firstName").eq("John"));
Employee employee = cursor.firstOrNull();```
**Transaction**
```java
try (Session session = db.createSession()) {
try (Transaction transaction = session.beginTransaction()) {
NitriteCollection txCol = transaction.getCollection("test");Document document = createDocument("firstName", "John");
txCol.insert(document);transaction.commit();
} catch (TransactionException e) {
transaction.rollback();
}
}```
**Schema Migration**
```java
Migration migration1 = new Migration(Constants.INITIAL_SCHEMA_VERSION, 2) {
@Override
public void migrate(InstructionSet instructions) {
instructions.forDatabase()
// make a non-secure db to secure db
.addUser("test-user", "test-password");// create instructions for existing repository
instructions.forRepository(OldClass.class, "demo1")// rename the repository (in case of entity name changes)
.renameRepository("migrated", null)// change datatype of field empId from String to Long and convert the values
.changeDataType("empId", (TypeConverter) Long::parseLong)// change id field from uuid to empId
.changeIdField(Fields.withNames("uuid"), Fields.withNames("empId"))// delete uuid field
.deleteField("uuid")
// rename field from lastName to familyName
.renameField("lastName", "familyName")// add new field fullName and add default value as - firstName + " " + lastName
.addField("fullName", document -> document.get("firstName", String.class) + " "
+ document.get("familyName", String.class))// drop index on firstName
.dropIndex("firstName")// drop index on embedded field literature.text
.dropIndex("literature.text")// change data type of embedded field from float to integer and convert the values
.changeDataType("literature.ratings", (TypeConverter) Math::round);
}
};Migration migration2 = new Migration(2, 3) {
@Override
public void migrate(InstructionSet instructions) {
instructions.forCollection("test")
.addField("fullName", "Dummy Name");
}
};MVStoreModule storeModule = MVStoreModule.withConfig()
.filePath("/temp/employee.db")
.compressHigh(true)
.build();db = Nitrite.builder()
.loadModule(storeModule)
// schema versioning is must for migration
.schemaVersion(2)// add defined migration paths
.addMigrations(migration1, migration2)
.openOrCreate();```
**Import/Export Data**
```java
// Export data to json file// create export options
ExportOptions exportOptions = new ExportOptions();
// set the nitrite factory
exportOptions.setNitriteFactory(() -> openDb("test.db"));
// set the collections to export
exportOptions.setCollections(List.of("first"));
// set the repositories to export
exportOptions.setRepositories(List.of("org.dizitart.no2.support.data.Employee", "org.dizitart.no2.support.data.Company"));
// set the keyed repositories to export
exportOptions.setKeyedRepositories(Map.of("key", Set.of("org.dizitart.no2.support.data.Employee")));
// create an exporter with export options
Exporter exporter = Exporter.withOptions(exportOptions);
exporter.exportTo("test.json");// Import data from the file
// create import options
ImportOptions importOptions = new ImportOptions();
// set the nitrite factory
importOptions.setNitriteFactory(() -> openDb("new-test.db"));
// create an importer with import options
Importer importer = Importer.withOptions(importOptions);
importer.importFrom("test.json");```
More details are available in the [guide](https://nitrite.dizitart.com/java-sdk/getting-started/index.html).
## Release Notes
Release notes are available [here](https://github.com/nitrite/nitrite-java/releases).
## Documentation
Reference
API
## Build
To build and test Nitrite, ensure you have JDK 11 (or higher) and Maven 3 installed.
```shell script
git clone https://github.com/nitrite/nitrite-java.git
cd nitrite-java
mvn clean install```
## Support / Feedback
For issues with, questions about, or feedback create a [discussion](https://github.com/orgs/nitrite/discussions).
## Bugs / Feature Requests
Think you’ve found a bug? Want to see a new feature in the Nitrite? Please open an issue [here](https://github.com/nitrite/nitrite-java/issues). But
before you file an issue please check if it is already existing or not.## Maintainers
- Anindya Chatterjee
## Contributors
This project exists thanks to all the people who contribute. For more details please visit [CONTRIBUTING.md](https://github.com/nitrite/nitrite-java/blob/main/CONTRIBUTING.md).
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](https://github.com/sponsors/anidotnet) for this project.
## Presentation & Talks
[Idan Sheinberg](https://github.com/sheinbergon) has given a talk on Nitrite at [**Kotlin Everywhere - TLV Edition**](https://www.meetup.com/KotlinTLV/events/265145254/) meetup on October 27, 2019. Please find his presentation [here](https://www.slideshare.net/IdanShinberg/nitrite-choosing-the-rite-embedded-database).
## Special Thanks