Skip to main content

DatabaseClient

MongoDB database client.

class DatabaseClient<
/** Data model types definitions. */
DataModel = DefaultDataModel,

/** Model class types definitions. */
Model extends BaseModel<DataModel> = BaseModel<DataModel>,
>

Properties​

  • DEFAULT_SORTING_PIPELINE: Default sorting pipeline.
  • SPLITTING_TOKENS: Pattern used to split full-text search queries into separate tokens.
  • DELETION_FILTER_PIPELINE: Pipeline to use first when fetching results from collections that don't enable deletion.
  • TOTAL_PIPELINE: Used to calculate total number of results for a given query.
  • DEFAULT_OFFSET: Default pagination offset value.
  • DEFAULT_LIMIT: Default pagination limit value.
  • DEFAULT_MAXIMUM_DEPTH: Default maximum level of resources depth.
  • DEFAULT_QUERY_OPTIONS: Default query options.
  • FORMATTERS: List of formatters, used to format a perseid data model into its MongoDB equivalent.
  • logger: Logging system.
  • cache: Cache client, used for results caching.
  • cacheDuration: Cache duration, in seconds.
  • client: MongoDB client instance.
  • database: MongoDB database instance.
  • model: Perseid data model to use.
  • isConnected: Whether MongoDB client is connected to the server.
  • relationsPerCollection: List of fields in data model representing external relations, per collection.
  • invertedRelationsPerCollection: List of fields in data model referencing each collection, grouped by this collection.

constructor​

public constructor(model: Model, logger: Logger, cache: CacheClient, settings: DatabaseClientSettings);

Description​

Class constructor.

Parameters​

  • model: Data model to use.
  • logger: Logging system to use.
  • cache: Cache client instance to use for results caching.
  • settings: Database client settings.

formatInput​

protected formatInput<Collection extends keyof DataModel>(input: Partial<DataModel[Collection]>): Document;

Description​

Formats input to match MongoDB data types specifications.

Parameters​

  • input: Input to format.

Returns​

MongoDB-formatted input.


formatPayload​

protected formatPayload<Collection extends keyof DataModel>(payload: Partial<DataModel[Collection]>): Document;

Description​

Formats payload for MongoDB update.

Parameters​

  • payload: Payload to format.

Returns​

MongoDB-formatted payload.


formatOutput​

protected formatOutput<Collection extends keyof DataModel>(output: Document, projections: Document | 1): Partial<DataModel[Collection]>;

Description​

Formats output to match database-independent data types specifications.

Parameters​

  • output: Output to format.
  • projections: List of current output fields to return.

Returns​

Formatted output.


checkReferencesTo​

protected checkReferencesTo(collection: keyof DataModel, id: Id): Promise<void>;

Description​

Makes sure that no collection references resource with id id from collection.

Parameters​

  • collection: Name of the collection the resource belongs to.
  • id: Id of the resource to check for references.

Throws​

  • If any collection still references resource.

getCollectionIndexedFields​

protected getCollectionIndexedFields(schema: FieldSchema<DataModel>, path?: string[]): Index[];

Description​

Returns all indexed fields for schema.

Parameters​

  • schema: Current data model schema for which to get indexes.
  • path: Optional path for indexed fields.

Returns​

Collection's indexed fields.


scanRelationsFrom​

protected scanRelationsFrom(schema: FieldSchema<DataModel>, relations: Map<string, string[]>, path?: string[]): void;

Description​

Scans schema to find foreign keys.

Parameters​

  • schema: Data model schema to scan.
  • relations: Map into which list of foreign keys and their related paths will be stored.
  • path: Optional current path in schema.

createSchema​

protected createSchema(schema: ObjectSchema<DataModel>): { $jsonSchema: MongoValidationSchema; };

Description​

Creates a Mongo validation schema from schema.

Parameters​

  • schema: Model from which to create validation schema.

Returns​

Mongo validation schema.


projectFromPath​

protected projectFromPath(path: string, maximumDepth: number, checkIndexing: boolean, splittedPath: string[], schema?: FieldSchema<DataModel>, projections?: Document, currentDepth?: number): Document;

Description​

Generates MongoDB-flavored projections object, from path.

Parameters​

  • path: Full path in the data model from which to generate projection.
  • maximumDepth: Maximum allowed level of resources depth.
  • checkIndexing: Whether to check that field is indexed.
  • splittedPath: Remaining path to analyze.
  • schema: Optional current path data model schema.
  • projections: Optional current path projections object.
  • currentDepth: Optional current level of resources depth.

Returns​

MongoDB projections object.

Throws​

  • If given path is not a valid field in data model.
  • If maximum level of resources depth has been exceeded.
  • If checkIndexing is true and given path is not an indexed field in data model.

generateProjectionsFrom​

protected generateProjectionsFrom(fields: { classic: string[]; indexed?: string[] }, schema: FieldSchema<DataModel>, maximumDepth: number): Document;

Description​

Generates MongoDB-flavored list of fields to project in results, from fields.

Parameters​

  • fields: Fields from which to generate projections object.
  • schema: Root collection schema.
  • maximumDepth: Maximum allowed level of resources depth.

Returns​

MongoDB projections.


generateLookupsPipelineFrom​

protected generateLookupsPipelineFrom(projections: Document, schema: FieldSchema<DataModel>, path?: string[], isFlatArray?: boolean): Document[];

Description​

Generates MongoDB $lookups pipeline from projections.

Parameters​

  • projections: Projections from which to generate pipeline.
  • schema: Current path data model schema.
  • path: Optional current path in data model.
  • isFlatArray: Optional flag indicating if current path is part of a flat array.

Returns​

Generated $lookups pipeline.


generateSortingPipelineFrom​

protected generateSortingPipelineFrom(sortBy: Exclude<CommandOptions['sortBy'], undefined>, sortOrder: Exclude<CommandOptions['sortOrder'], undefined>): Document[];

Description​

Generates MongoDB $sort pipeline from sortBy and sortOrder.

Parameters​

  • sortBy: List of fields' paths to sort results by.
  • sortOrder: Sorting orders (asc/desc) for each field path.

Returns​

Generated $sort pipeline.

Throws​

  • If sortBy and sortOrder are not the same size.

generatePaginationPipelineFrom​

protected generatePaginationPipelineFrom(offset?: number, limit?: number): Document[];

Description​

Generates MongoDB $skip and $limit pipeline from offset and limit.

Parameters​

  • offset: Pagination offset.
  • limit: Maximum number of results to fetch.

Returns​

Generated pagination pipeline.


generateSearchPipelineFrom​

protected generateSearchPipelineFrom(query: SearchQuery | null, filters: SearchFilters | null): Document[];

Description​

Generates MongoDB search pipeline from query and filters.

Parameters​

  • query: Search query.
  • filters: Search filters.

Returns​

Generated search pipeline.


handleError​

protected handleError<T>(callback: () => Promise<T>): Promise<T>;

Description​

Connects database client to the MongoDB server before performing any query, and handles common MongoDB server errors.

Parameters​

  • callback: Callback to wrap in the error handler.

Throws​

  • If connection to the server failed.
  • Transformed MongoDB error if applicable, original error otherwise.

checkFields​

public checkFields(collection: keyof DataModel, fields: string[], maximumDepth?: number): void;

Description​

Exposes generateProjectionsFrom method in order to make sure that all fields are valid.

Parameters​

  • collection: Root collection from which to check fields.
  • fields: Fields to check.
  • maximumDepth: Optional maximum allowed level of resources depth.

checkForeignIds​

public checkForeignIds(foreignIds: Map<string, SearchFilters[]>): Promise<void>;

Description​

Makes sure that foreignIds reference existing resources that match specific conditions.

Parameters​

  • foreignIds: Foreign ids to check in database.

Throws​

  • If any foreign id does not exist.

create​

public create<Collection extends keyof DataModel>(collection: Collection, resource: DataModel[Collection]): Promise<void>;

Description​

Inserts resource into collection.

Parameters​

  • collection: Name of the collection to insert resource into.
  • resource: New resource to insert.

update​

public update<Collection extends keyof DataModel>(collection: Collection, id: Id, payload: Partial<DataModel[Collection]>): Promise<void>;

Description​

Updates resource with id id from collection.

Parameters​

  • collection: Name of the collection to update resource from.
  • id: Resource id.
  • payload: Updated resource payload.

exclusiveUpdate​

public exclusiveUpdate<Collection extends keyof DataModel>(collection: Collection, filters: SearchFilters, payload: Partial<DataModel[Collection]>): Promise<boolean>;

Description​

Updates resource matching filters from collection, using a write lock.

Parameters​

  • collection: Name of the collection to update resource from.
  • filters: Filters that resource must match.
  • payload: Updated resource payload.

Returns​

true if resource was updated, false otherwise.


view​

public view<Collection extends keyof DataModel>(collection: Collection, id: Id, options?: CommandOptions): Promise<DataModel[Collection] | null>;

Description​

Fetches resource with id id from collection.

Parameters​

  • collection: Name of the collection to fetch resource from.
  • id: Id of the resource to fetch.
  • options: Optional query options.

Returns​

Resource if it exists, null otherwise.


public search<Collection extends keyof DataModel>(collection: Collection, body: SearchBody, options?: CommandOptions): Promise<Results<DataModel[Collection]>>;

Description​

Fetches a paginated list of resources from collection, that match specific filters/query.

Parameters​

  • collection: Collection to fetch resources from.
  • body: Search/filters body.
  • options: Optional query options.

Returns​

Paginated list of resources.


list​

public list<Collection extends keyof DataModel>(collection: Collection, options?: CommandOptions): Promise<Results<DataModel[Collection]>>;

Description​

Fetches a paginated list of resources from collection.

Parameters​

  • collection: Name of the collection from which to fetch resources.
  • options: Optional query options.

Returns​

Paginated list of resources.


delete​

public delete<Collection extends keyof DataModel>(collection: Collection, id: Id, payload?: Partial<DataModel[Collection]>): Promise<boolean>;

Description​

Deletes resource with id id from collection.

Parameters​

  • collection: Name of the collection to delete resource from.
  • id: Resource id.
  • payload: Optional additional payload to update resource with in case of soft-deletion.

Returns​

true if resource has been successfully deleted, false otherwise.


dropDatabase​

public dropDatabase(): Promise<void>;

Description​

Drops entire database.


createDatabase​

public createDatabase(): Promise<void>;

Description​

Creates database.


resetCollection​

public resetCollection<Collection extends keyof DataModel>(collection: Collection): Promise<void>;

Description​

Creates collection with name name.

Parameters​

  • collection: Name of the collection to create.

updateCollection​

public updateCollection<Collection extends keyof DataModel>(collection: Collection, migration?: MigrationCallback): Promise<void>;

Description​

Performs a validation schema update and a data migration on collection with name name.

Parameters​

  • collection: Name of the collection to update.
  • migration: Optional migration to perform.

dropCollection​

public dropCollection(collection: keyof DataModel): Promise<void>;

Description​

Drops collection from database.

Parameters​

  • collection: Name of the collection to drop from database.