Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
fee936c75f | |||
ac867401de | |||
c066464526 | |||
0105aa2a18 | |||
4c2477c269 | |||
ea0d2bb251 | |||
b3e30a8711 | |||
64621dd38f |
22
changelog.md
22
changelog.md
@ -1,5 +1,27 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-02-03 - 5.2.11 - fix(documentation)
|
||||||
|
Updated project documentation for accuracy and added advanced feature details
|
||||||
|
|
||||||
|
- Added details for EasyStore, Distributed Coordination, and Real-time Data Watching features.
|
||||||
|
- Updated database connection setup instructions to include user authentication.
|
||||||
|
- Re-organized advanced usage section to showcase additional features separately.
|
||||||
|
|
||||||
|
## 2024-09-05 - 5.2.10 - fix(smartdata.classes.doc)
|
||||||
|
Fix issue with array handling in convertFilterForMongoDb function
|
||||||
|
|
||||||
|
- Corrected the logic to properly handle array filters in the convertFilterForMongoDb function to avoid incorrect assignments.
|
||||||
|
|
||||||
|
## 2024-09-05 - 5.2.9 - fix(smartdata.classes.doc)
|
||||||
|
Fixed issue with convertFilterForMongoDb to handle array operators.
|
||||||
|
|
||||||
|
- Updated the convertFilterForMongoDb function in smartdata.classes.doc.ts to properly handle array operators like $in and $all.
|
||||||
|
|
||||||
|
## 2024-09-05 - 5.2.8 - fix(smartdata.classes.doc)
|
||||||
|
Fix key handling in convertFilterForMongoDb function
|
||||||
|
|
||||||
|
- Fixed an issue in convertFilterForMongoDb that allowed keys with dots which could cause errors.
|
||||||
|
|
||||||
## 2024-09-05 - 5.2.7 - fix(core)
|
## 2024-09-05 - 5.2.7 - fix(core)
|
||||||
Fixed issue with handling filter keys containing dots in smartdata.classes.doc.ts
|
Fixed issue with handling filter keys containing dots in smartdata.classes.doc.ts
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartdata",
|
"name": "@push.rocks/smartdata",
|
||||||
"version": "5.2.7",
|
"version": "5.2.11",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.",
|
"description": "An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
|
86
readme.md
86
readme.md
@ -1,5 +1,24 @@
|
|||||||
# @push.rocks/smartdata
|
# @push.rocks/smartdata
|
||||||
do more with data
|
|
||||||
|
[](https://www.npmjs.com/package/@push.rocks/smartdata)
|
||||||
|
[](https://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
A powerful TypeScript-first MongoDB wrapper that provides advanced features for distributed systems, real-time data synchronization, and easy data management.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Type-Safe MongoDB Integration**: Full TypeScript support with decorators for schema definition
|
||||||
|
- **EasyStore**: Simple key-value storage with automatic persistence and sharing between instances
|
||||||
|
- **Distributed Coordination**: Built-in support for leader election and distributed task management
|
||||||
|
- **Real-time Data Sync**: Watchers for real-time data changes and synchronization
|
||||||
|
- **Connection Management**: Automatic connection handling with connection pooling
|
||||||
|
- **Collection Management**: Type-safe collection operations with automatic indexing
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Node.js >= 16.x
|
||||||
|
- MongoDB >= 4.4
|
||||||
|
- TypeScript >= 4.x (for development)
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
To install `@push.rocks/smartdata`, use npm:
|
To install `@push.rocks/smartdata`, use npm:
|
||||||
@ -14,20 +33,21 @@ This will add `@push.rocks/smartdata` to your project's dependencies.
|
|||||||
`@push.rocks/smartdata` enables efficient data handling and operation management with a focus on using MongoDB. It leverages TypeScript for strong typing and ESM syntax for modern JavaScript usage. Below are various scenarios demonstrating how to utilize this package effectively in a project.
|
`@push.rocks/smartdata` enables efficient data handling and operation management with a focus on using MongoDB. It leverages TypeScript for strong typing and ESM syntax for modern JavaScript usage. Below are various scenarios demonstrating how to utilize this package effectively in a project.
|
||||||
|
|
||||||
### Setting Up and Connecting to the Database
|
### Setting Up and Connecting to the Database
|
||||||
Before interacting with the database, you need to set up and establish a connection. This is done by creating an instance of `SmartdataDb` and calling its `init` method with your MongoDB connection details.
|
Before interacting with the database, you need to set up and establish a connection. The `SmartdataDb` class handles connection pooling and automatic reconnection.
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { SmartdataDb } from '@push.rocks/smartdata';
|
import { SmartdataDb } from '@push.rocks/smartdata';
|
||||||
|
|
||||||
// Create a new instance of SmartdataDb with MongoDB connection details
|
// Create a new instance of SmartdataDb with MongoDB connection details
|
||||||
const db = new SmartdataDb({
|
const db = new SmartdataDb({
|
||||||
mongoDbUrl: 'mongodb://localhost:27017',
|
mongoDbUrl: 'mongodb://<USERNAME>:<PASSWORD>@localhost:27017/<DBNAME>',
|
||||||
mongoDbName: 'your-database-name',
|
mongoDbName: 'your-database-name',
|
||||||
mongoDbUser: 'your-username',
|
mongoDbUser: 'your-username',
|
||||||
mongoDbPass: 'your-password',
|
mongoDbPass: 'your-password',
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initialize and connect to the database
|
// Initialize and connect to the database
|
||||||
|
// This sets up a connection pool with max 100 connections
|
||||||
await db.init();
|
await db.init();
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -87,13 +107,67 @@ await user.save(); // Update the user in the database
|
|||||||
await user.delete(); // Delete the user from the database
|
await user.delete(); // Delete the user from the database
|
||||||
```
|
```
|
||||||
|
|
||||||
### Advanced Usage
|
### Advanced Features
|
||||||
`@push.rocks/smartdata` also supports advanced features like watching for real-time changes in the database, handling distributed data coordination, and more. These features utilize MongoDB's capabilities to provide real-time data syncing and distributed systems coordination.
|
|
||||||
|
#### EasyStore
|
||||||
|
EasyStore provides a simple key-value storage system with automatic persistence:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Create an EasyStore instance
|
||||||
|
const store = await db.createEasyStore<YourDataType>('store-name');
|
||||||
|
|
||||||
|
// Write and read data
|
||||||
|
await store.writeKey('key', value);
|
||||||
|
const value = await store.readKey('key');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Distributed Coordination
|
||||||
|
Built-in support for distributed systems with leader election:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Create a distributed coordinator
|
||||||
|
const coordinator = new SmartdataDistributedCoordinator(db);
|
||||||
|
|
||||||
|
// Start coordination
|
||||||
|
await coordinator.start();
|
||||||
|
|
||||||
|
// Handle leadership changes
|
||||||
|
coordinator.on('leadershipChange', (isLeader) => {
|
||||||
|
if (isLeader) {
|
||||||
|
// This instance is now the leader
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Real-time Data Watching
|
||||||
|
Watch for changes in your collections:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const watcher = new SmartdataDbWatcher(collection);
|
||||||
|
|
||||||
|
watcher.on('change', (change) => {
|
||||||
|
console.log('Document changed:', change);
|
||||||
|
});
|
||||||
|
|
||||||
|
await watcher.start();
|
||||||
|
```
|
||||||
|
|
||||||
### Conclusion
|
### Conclusion
|
||||||
With its focus on TypeScript, modern JavaScript syntax, and leveraging MongoDB's features, `@push.rocks/smartdata` offers a powerful toolkit for data handling and operations management in Node.js applications. Its design for ease of use, coupled with advanced features, makes it a versatile choice for developers looking to build efficient and scalable data-driven applications.
|
With its focus on TypeScript, modern JavaScript syntax, and leveraging MongoDB's features, `@push.rocks/smartdata` offers a powerful toolkit for data handling and operations management in Node.js applications. Its design for ease of use, coupled with advanced features, makes it a versatile choice for developers looking to build efficient and scalable data-driven applications.
|
||||||
|
|
||||||
For more details on usage and additional features, refer to the [official documentation](https://gitlab.com/push.rocks/smartdata#README) and explore the various classes and methods provided by `@push.rocks/smartdata`.
|
For more details on usage and additional features, refer to the [official documentation](https://gitlab.com/push.rocks/smartdata/-/blob/master/README.md) and explore the various classes and methods provided by `@push.rocks/smartdata`.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We welcome contributions to @push.rocks/smartdata! Here's how you can help:
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
||||||
|
4. Push to the branch (`git push origin feature/amazing-feature`)
|
||||||
|
5. Open a Pull Request
|
||||||
|
|
||||||
|
Please make sure to update tests as appropriate and follow our coding standards.
|
||||||
|
|
||||||
## License and Legal Information
|
## License and Legal Information
|
||||||
|
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartdata',
|
name: '@push.rocks/smartdata',
|
||||||
version: '5.2.7',
|
version: '5.2.11',
|
||||||
description: 'An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.'
|
description: 'An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.'
|
||||||
}
|
}
|
||||||
|
@ -53,15 +53,18 @@ export function unI() {
|
|||||||
|
|
||||||
export const convertFilterForMongoDb = (filterArg: { [key: string]: any }) => {
|
export const convertFilterForMongoDb = (filterArg: { [key: string]: any }) => {
|
||||||
const convertedFilter: { [key: string]: any } = {};
|
const convertedFilter: { [key: string]: any } = {};
|
||||||
|
|
||||||
const convertFilterArgument = (keyPathArg2: string, filterArg2: any) => {
|
const convertFilterArgument = (keyPathArg2: string, filterArg2: any) => {
|
||||||
if (typeof filterArg2 === 'object') {
|
if (Array.isArray(filterArg2)) {
|
||||||
|
// Directly assign arrays (they might be using operators like $in or $all)
|
||||||
|
convertFilterArgument(keyPathArg2, filterArg2[0]);
|
||||||
|
} else if (typeof filterArg2 === 'object' && filterArg2 !== null) {
|
||||||
for (const key of Object.keys(filterArg2)) {
|
for (const key of Object.keys(filterArg2)) {
|
||||||
if (key.startsWith('$')) {
|
if (key.startsWith('$')) {
|
||||||
convertedFilter[keyPathArg2] = filterArg2;
|
convertedFilter[keyPathArg2] = filterArg2;
|
||||||
return;
|
return;
|
||||||
} else if (key.includes('.')) {
|
} else if (key.includes('.')) {
|
||||||
convertedFilter[keyPathArg2] = filterArg2;
|
throw new Error('keys cannot contain dots');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const key of Object.keys(filterArg2)) {
|
for (const key of Object.keys(filterArg2)) {
|
||||||
@ -71,6 +74,7 @@ export const convertFilterForMongoDb = (filterArg: { [key: string]: any }) => {
|
|||||||
convertedFilter[keyPathArg2] = filterArg2;
|
convertedFilter[keyPathArg2] = filterArg2;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const key of Object.keys(filterArg)) {
|
for (const key of Object.keys(filterArg)) {
|
||||||
convertFilterArgument(key, filterArg[key]);
|
convertFilterArgument(key, filterArg[key]);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user