MongoDB Support in Mapping Suite SDK
Overview
The Mapping Suite SDK provides robust MongoDB integration through the MongoDBRepository class, enabling seamless storage, retrieval, and management of mapping packages in a MongoDB database.
Key Features
-
Create, read, update, and delete mapping packages
-
Flexible querying capabilities
-
Type-safe operations with Pydantic models
-
Tracing and logging support
Setting Up MongoDB Repository
Basic Initialisation
from pymongo import MongoClient
from mapping_suite_sdk import MongoDBRepository
from mapping_suite_sdk.models.mapping_package import MappingPackage
# Initialise MongoDB client
mongo_client = MongoClient("mongodb://localhost:27017/")
# Create a repository for mapping packages
repository = MongoDBRepository(
model_class=MappingPackage,
mongo_client=mongo_client,
database_name="mapping_suites",
collection_name="packages"
)
CRUD Operations
Create a Mapping Package
from pathlib import Path
from mapping_suite_sdk import load_mapping_package_from_folder
# Load a mapping package
package = load_mapping_package_from_folder(
mapping_package_folder_path=Path("/path/to/package")
)
# Store the package in MongoDB
repository.create(package)
print(f"Package stored with ID: {package.id}")
Retrieve a Mapping Package
from mapping_suite_sdk import load_mapping_package_from_mongo_db
# Retrieve a package by its unique ID
retrieved_package = load_mapping_package_from_mongo_db(
mapping_package_id=package.id,
mapping_package_repository=repository
)
Query Multiple Packages
# Query packages based on metadata
packages_v1 = repository.read_many({"metadata.version": "1.0.0"})
# Query with complex filters
packages_can = repository.read_many({
"metadata.version": {"$gte": "1.5.0"}
})
Advanced Repository Usage
Custom Model Repositories
You can create repositories for custom models by implementing the RepositoryABC:
from typing import Optional, Dict, Any, List
from pydantic import BaseModel
from mapping_suite_sdk.adapters.repository import RepositoryABC, MongoDBRepository
class CustomModel(BaseModel):
name: str
version: str
metadata: Optional[Dict[str, Any]] = None
class CustomModelRepository(MongoDBRepository[CustomModel]):
# Optional: Add custom methods specific to your model
def find_by_name(self, name: str) -> List[CustomModel]:
return self.read_many({"name": name})
# Usage
custom_repo = CustomModelRepository(
model_class=CustomModel,
mongo_client=MongoClient("mongodb://localhost:27017/"),
database_name="custom_db",
collection_name="custom_models"
)
Error Handling
from mapping_suite_sdk.adapters.repository import ModelNotFoundError, RepositoryError
def safe_repository_operation(repository, package_id):
try:
# Retrieve package
package = repository.read(package_id)
print(f"Package found: {package}")
except ModelNotFoundError:
print(f"No package found with ID: {package_id}")
except RepositoryError as e:
print(f"Repository operation failed: {e}")
# Example usage
safe_repository_operation(repository, "non_existent_id")
Best Practices
-
Connection Management
-
Use connection pooling
-
Close MongoDB connections when done
-
Handle connection errors gracefully
-
-
Security
-
Use environment variables for connection strings
-
Implement authentication
-
Use TLS/SSL for connections
-
-
Performance
-
Index frequently queried fields
-
Use appropriate connection settings
-
Monitor query performance
-
-
Error Handling
-
Implement robust error catching
-
Log repository operations
-
Provide meaningful error messages
-