mongoose
Version:
Mongoose MongoDB ODM
858 lines (729 loc) • 41.6 kB
TypeScript
/// <reference path="./aggregate.d.ts" />
/// <reference path="./callback.d.ts" />
/// <reference path="./collection.d.ts" />
/// <reference path="./connection.d.ts" />
/// <reference path="./cursor.d.ts" />
/// <reference path="./document.d.ts" />
/// <reference path="./error.d.ts" />
/// <reference path="./expressions.d.ts" />
/// <reference path="./helpers.d.ts" />
/// <reference path="./middlewares.d.ts" />
/// <reference path="./indexes.d.ts" />
/// <reference path="./models.d.ts" />
/// <reference path="./mongooseoptions.d.ts" />
/// <reference path="./pipelinestage.d.ts" />
/// <reference path="./populate.d.ts" />
/// <reference path="./query.d.ts" />
/// <reference path="./schemaoptions.d.ts" />
/// <reference path="./schematypes.d.ts" />
/// <reference path="./session.d.ts" />
/// <reference path="./types.d.ts" />
/// <reference path="./utility.d.ts" />
/// <reference path="./validation.d.ts" />
/// <reference path="./inferrawdoctype.d.ts" />
/// <reference path="./inferschematype.d.ts" />
/// <reference path="./virtuals.d.ts" />
/// <reference path="./augmentations.d.ts" />
declare class NativeDate extends globalThis.Date { }
declare module 'mongoose' {
import Kareem = require('kareem');
import events = require('events');
import mongodb = require('mongodb');
import mongoose = require('mongoose');
export type Mongoose = typeof mongoose;
/**
* Mongoose constructor. The exports object of the `mongoose` module is an instance of this
* class. Most apps will only use this one instance.
*/
export const Mongoose: new (options?: MongooseOptions | null) => Mongoose;
export let Promise: any;
/**
* Can be extended to explicitly type specific models.
*/
export interface Models {
[modelName: string]: Model<any>
}
/** An array containing all models associated with this Mongoose instance. */
export const models: Models;
/**
* Removes the model named `name` from the default connection, if it exists.
* You can use this function to clean up any models you created in your tests to
* prevent OverwriteModelErrors.
*/
export function deleteModel(name: string | RegExp): Mongoose;
/**
* Sanitizes query filters against query selector injection attacks by wrapping
* any nested objects that have a property whose name starts with `$` in a `$eq`.
*/
export function sanitizeFilter<T>(filter: FilterQuery<T>): FilterQuery<T>;
/** Gets mongoose options */
export function get<K extends keyof MongooseOptions>(key: K): MongooseOptions[K];
export function omitUndefined<T extends Record<string, any>>(val: T): T;
/* ! ignore */
export type CompileModelOptions = {
overwriteModels?: boolean,
connection?: Connection
};
export function model<TSchema extends Schema = any>(
name: string,
schema?: TSchema,
collection?: string,
options?: CompileModelOptions
): Model<
InferSchemaType<TSchema>,
ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>,
ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
ObtainSchemaGeneric<TSchema, 'TVirtuals'>,
HydratedDocument<
InferSchemaType<TSchema>,
ObtainSchemaGeneric<TSchema, 'TVirtuals'> & ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>
>,
TSchema
> & ObtainSchemaGeneric<TSchema, 'TStaticMethods'>;
export function model<T>(name: string, schema?: Schema<T, any, any> | Schema<T & Document, any, any>, collection?: string, options?: CompileModelOptions): Model<T>;
export function model<T, U, TQueryHelpers = {}>(
name: string,
schema?: Schema<T, any, any, TQueryHelpers, any, any, any>,
collection?: string,
options?: CompileModelOptions
): U;
/** Returns an array of model names created on this instance of Mongoose. */
export function modelNames(): Array<string>;
/**
* Overwrites the current driver used by this Mongoose instance. A driver is a
* Mongoose-specific interface that defines functions like `find()`.
*/
export function setDriver(driver: any): Mongoose;
/** The node-mongodb-native driver Mongoose uses. */
export { mongodb as mongo };
/** Declares a global plugin executed on all Schemas. */
export function plugin(fn: (schema: Schema, opts?: any) => void, opts?: any): Mongoose;
/** Getter/setter around function for pluralizing collection names. */
export function pluralize(fn?: ((str: string) => string) | null): ((str: string) => string) | null;
/** Sets mongoose options */
export function set<K extends keyof MongooseOptions>(key: K, value: MongooseOptions[K]): Mongoose;
export function set(options: { [K in keyof MongooseOptions]: MongooseOptions[K] }): Mongoose;
/** The Mongoose version */
export const version: string;
export type AnyKeys<T> = { [P in keyof T]?: T[P] | any };
export interface AnyObject {
[k: string]: any
}
export type Require_id<T> = T extends { _id?: infer U }
? IfAny<U, T & { _id: Types.ObjectId }, T & Required<{ _id: U }>>
: T & { _id: Types.ObjectId };
export type Default__v<T> = T extends { __v?: infer U }
? T
: T & { __v: number };
/** Helper type for getting the hydrated document type from the raw document type. The hydrated document type is what `new MyModel()` returns. */
export type HydratedDocument<
DocType,
TOverrides = {},
TQueryHelpers = {}
> = IfAny<
DocType,
any,
TOverrides extends Record<string, never> ?
Document<unknown, TQueryHelpers, DocType> & Default__v<Require_id<DocType>> :
IfAny<
TOverrides,
Document<unknown, TQueryHelpers, DocType> & Default__v<Require_id<DocType>>,
Document<unknown, TQueryHelpers, DocType> & MergeType<
Default__v<Require_id<DocType>>,
TOverrides
>
>
>;
export type HydratedSingleSubdocument<
DocType,
TOverrides = {}
> = IfAny<
DocType,
any,
TOverrides extends Record<string, never> ?
Types.Subdocument<unknown, Record<string, never>, DocType> & Require_id<DocType> :
IfAny<
TOverrides,
Types.Subdocument<unknown, Record<string, never>, DocType> & Require_id<DocType>,
Types.Subdocument<unknown, Record<string, never>, DocType> & MergeType<
Require_id<DocType>,
TOverrides
>
>
>;
export type HydratedArraySubdocument<DocType, TOverrides = {}> = IfAny<
DocType,
any,
TOverrides extends Record<string, never> ?
Types.ArraySubdocument<unknown, Record<string, never>, DocType> & Require_id<DocType> :
IfAny<
TOverrides,
Types.ArraySubdocument<unknown, Record<string, never>, DocType> & Require_id<DocType>,
Types.ArraySubdocument<unknown, Record<string, never>, DocType> & MergeType<
Require_id<DocType>,
TOverrides
>
>
>;
export type HydratedDocumentFromSchema<TSchema extends Schema> = HydratedDocument<
InferSchemaType<TSchema>,
ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>
>;
export interface TagSet {
[k: string]: string;
}
export interface ToObjectOptions<THydratedDocumentType = HydratedDocument<unknown>> {
/** if `options.virtuals = true`, you can set `options.aliases = false` to skip applying aliases. This option is a no-op if `options.virtuals = false`. */
aliases?: boolean;
/** if true, replace any conventionally populated paths with the original id in the output. Has no affect on virtual populated paths. */
depopulate?: boolean;
/** if true, convert Maps to POJOs. Useful if you want to `JSON.stringify()` the result of `toObject()`. */
flattenMaps?: boolean;
/** if true, convert any ObjectIds in the result to 24 character hex strings. */
flattenObjectIds?: boolean;
/** apply all getters (path and virtual getters) */
getters?: boolean;
/** remove empty objects (defaults to true) */
minimize?: boolean;
/** If true, the resulting object will only have fields that are defined in the document's schema. By default, `toJSON()` & `toObject()` returns all fields in the underlying document from MongoDB, including ones that are not listed in the schema. */
schemaFieldsOnly?: boolean;
/** if set, mongoose will call this function to allow you to transform the returned object */
transform?: boolean | ((
doc: THydratedDocumentType,
ret: Record<string, any>,
options: ToObjectOptions<THydratedDocumentType>
) => any);
/** If true, omits fields that are excluded in this document's projection. Unless you specified a projection, this will omit any field that has `select: false` in the schema. */
useProjection?: boolean;
/** if false, exclude the version key (`__v` by default) from the output */
versionKey?: boolean;
/** apply virtual getters (can override getters option) */
virtuals?: boolean | string[];
}
export type DiscriminatorModel<M, T> = T extends Model<infer T, infer TQueryHelpers, infer TInstanceMethods, infer TVirtuals>
?
M extends Model<infer M, infer MQueryHelpers, infer MInstanceMethods, infer MVirtuals>
? Model<Omit<M, keyof T> & T, MQueryHelpers | TQueryHelpers, MInstanceMethods | TInstanceMethods, MVirtuals | TVirtuals>
: M
: M;
export type DiscriminatorSchema<DocType, M, TInstanceMethods, TQueryHelpers, TVirtuals, TStaticMethods, DisSchema> =
DisSchema extends Schema<infer DisSchemaEDocType, infer DisSchemaM, infer DisSchemaInstanceMethods, infer DisSchemaQueryhelpers, infer DisSchemaVirtuals, infer DisSchemaStatics>
? Schema<MergeType<DocType, DisSchemaEDocType>, DiscriminatorModel<DisSchemaM, M>, DisSchemaInstanceMethods | TInstanceMethods, DisSchemaQueryhelpers | TQueryHelpers, DisSchemaVirtuals | TVirtuals, DisSchemaStatics & TStaticMethods>
: Schema<DocType, M, TInstanceMethods, TQueryHelpers, TVirtuals, TStaticMethods>;
type QueryResultType<T> = T extends Query<infer ResultType, any> ? ResultType : never;
type PluginFunction<
DocType,
M,
TInstanceMethods,
TQueryHelpers,
TVirtuals,
TStaticMethods> = (schema: Schema<DocType, M, TInstanceMethods, TQueryHelpers, TVirtuals, TStaticMethods>, opts?: any) => void;
export class Schema<
RawDocType = any,
TModelType = Model<RawDocType, any, any, any>,
TInstanceMethods = {},
TQueryHelpers = {},
TVirtuals = {},
TStaticMethods = {},
TSchemaOptions = DefaultSchemaOptions,
DocType extends ApplySchemaOptions<
ObtainDocumentType<DocType, RawDocType, ResolveSchemaOptions<TSchemaOptions>>,
ResolveSchemaOptions<TSchemaOptions>
> = ApplySchemaOptions<
ObtainDocumentType<any, RawDocType, ResolveSchemaOptions<TSchemaOptions>>,
ResolveSchemaOptions<TSchemaOptions>
>,
THydratedDocumentType = HydratedDocument<FlatRecord<DocType>, TVirtuals & TInstanceMethods>
>
extends events.EventEmitter {
/**
* Create a new schema
*/
constructor(definition?: SchemaDefinition<SchemaDefinitionType<RawDocType>, RawDocType, THydratedDocumentType> | DocType, options?: SchemaOptions<FlatRecord<DocType>, TInstanceMethods, TQueryHelpers, TStaticMethods, TVirtuals, THydratedDocumentType> | ResolveSchemaOptions<TSchemaOptions>);
/** Adds key path / schema type pairs to this schema. */
add(obj: SchemaDefinition<SchemaDefinitionType<RawDocType>, RawDocType> | Schema, prefix?: string): this;
/**
* Add an alias for `path`. This means getting or setting the `alias`
* is equivalent to getting or setting the `path`.
*/
alias(path: string, alias: string | string[]): this;
/**
* Array of child schemas (from document arrays and single nested subdocs)
* and their corresponding compiled models. Each element of the array is
* an object with 2 properties: `schema` and `model`.
*/
childSchemas: { schema: Schema, model: any }[];
/** Removes all indexes on this schema */
clearIndexes(): this;
/** Returns a copy of this schema */
clone<T = this>(): T;
discriminator<DisSchema = Schema>(name: string | number, schema: DisSchema, options?: DiscriminatorOptions): this;
/** Returns a new schema that has the picked `paths` from this schema. */
pick<T = this>(paths: string[], options?: SchemaOptions): T;
/** Object containing discriminators defined on this schema */
discriminators?: { [name: string]: Schema };
/** Iterates the schemas paths similar to Array#forEach. */
eachPath(fn: (path: string, type: SchemaType) => void): this;
/** Defines an index (most likely compound) for this schema. */
index(fields: IndexDefinition, options?: Omit<IndexOptions, 'unique'> & { unique?: boolean | [true, string] }): this;
/**
* Define a search index for this schema.
*
* @remarks Search indexes are only supported when used against a 7.0+ Mongo Atlas cluster.
*/
searchIndex(description: SearchIndexDescription): this;
/**
* Returns a list of indexes that this schema declares, via `schema.index()`
* or by `index: true` in a path's options.
*/
indexes(): Array<[IndexDefinition, IndexOptions]>;
/** Gets a schema option. */
get<K extends keyof SchemaOptions>(key: K): SchemaOptions[K];
/**
* Loads an ES6 class into a schema. Maps [setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) + [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get), [static methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static),
* and [instance methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Class_body_and_method_definitions)
* to schema [virtuals](http://mongoosejs.com/docs/guide.html#virtuals),
* [statics](http://mongoosejs.com/docs/guide.html#statics), and
* [methods](http://mongoosejs.com/docs/guide.html#methods).
*/
loadClass(model: Function, onlyVirtuals?: boolean): this;
/** Adds an instance method to documents constructed from Models compiled from this schema. */
method<Context = THydratedDocumentType>(name: string, fn: (this: Context, ...args: any[]) => any, opts?: any): this;
method(obj: Partial<TInstanceMethods>): this;
/** Object of currently defined methods on this schema. */
methods: AddThisParameter<TInstanceMethods, THydratedDocumentType> & AnyObject;
/** The original object passed to the schema constructor */
obj: SchemaDefinition<SchemaDefinitionType<RawDocType>, RawDocType>;
/** Returns a new schema that has the `paths` from the original schema, minus the omitted ones. */
omit<T = this>(paths: string[], options?: SchemaOptions): T;
/** Gets/sets schema paths. */
path<ResultType extends SchemaType = SchemaType<any, THydratedDocumentType>>(path: string): ResultType;
path<pathGeneric extends keyof RawDocType>(path: pathGeneric): SchemaType<RawDocType[pathGeneric]>;
path(path: string, constructor: any): this;
/** Lists all paths and their type in the schema. */
paths: {
[key: string]: SchemaType;
};
/** Returns the pathType of `path` for this schema. */
pathType(path: string): string;
/** Registers a plugin for this schema. */
plugin<PFunc extends PluginFunction<DocType, TModelType, any, any, any, any>, POptions extends Parameters<PFunc>[1] = Parameters<PFunc>[1]>(fn: PFunc, opts?: POptions): this;
/** Defines a post hook for the model. */
// PostMiddlewareFunction
// with errorHandler set to true
post<T = Query<any, any>>(method: MongooseQueryMiddleware | MongooseQueryMiddleware[] | RegExp, options: SchemaPostOptions & { errorHandler: true }, fn: ErrorHandlingMiddlewareWithOption<T>): this;
post<T = THydratedDocumentType>(method: MongooseDocumentMiddleware | MongooseDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { errorHandler: true }, fn: ErrorHandlingMiddlewareWithOption<T>): this;
post<T extends Aggregate<any>>(method: 'aggregate' | RegExp, options: SchemaPostOptions & { errorHandler: true }, fn: ErrorHandlingMiddlewareWithOption<T, Array<any>>): this;
post<T = TModelType>(method: 'insertMany' | RegExp, options: SchemaPostOptions & { errorHandler: true }, fn: ErrorHandlingMiddlewareWithOption<T>): this;
// this = never since it never happens
post<T = never>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: false, query: false }, fn: PostMiddlewareFunction<never, never>): this;
post<T = never>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPostOptions & { document: boolean, query: false }, fn: PostMiddlewareFunction<T, QueryResultType<T>>): this;
post<T = never>(method: MongooseDistinctDocumentMiddleware | MongooseDistinctDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: false, query: true }, fn: PostMiddlewareFunction<T, T>): this;
// this = Document
post<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], fn: PostMiddlewareFunction<T, T>): this;
post<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], options: SchemaPostOptions & SchemaPostOptions, fn: PostMiddlewareFunction<T, T>): this;
post<T = THydratedDocumentType>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: true, query: false }, fn: PostMiddlewareFunction<T, T>): this;
// this = Query
post<T = Query<any, any>>(method: MongooseRawResultQueryMiddleware|MongooseRawResultQueryMiddleware[], fn: PostMiddlewareFunction<T, null | QueryResultType<T> | ModifyResult<QueryResultType<T>>>): this;
post<T = Query<any, any>>(method: MongooseDefaultQueryMiddleware|MongooseDefaultQueryMiddleware[], fn: PostMiddlewareFunction<T, QueryResultType<T>>): this;
post<T = Query<any, any>>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPostOptions, fn: PostMiddlewareFunction<T, QueryResultType<T>>): this;
post<T = Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: false, query: true }, fn: PostMiddlewareFunction<T, QueryResultType<T>>): this;
// this = Union of Document and Query, could be called with any of them
post<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: true, query: true }, fn: PostMiddlewareFunction<T, T|QueryResultType<T>>): this;
post<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, fn: PostMiddlewareFunction<T, T|QueryResultType<T>>): this;
// ErrorHandlingMiddlewareFunction
// this = never since it never happens
post<T = never>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPostOptions & { document: boolean, query: false }, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = never>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], options: SchemaPostOptions & { document: false, query: boolean }, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = never>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: false, query: false }, fn: ErrorHandlingMiddlewareFunction<T>): this;
// this = Document
post<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], options: SchemaPostOptions, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = THydratedDocumentType>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: true, query: false }, fn: ErrorHandlingMiddlewareFunction<T>): this;
// this = Query
post<T = Query<any, any>>(method: MongooseDefaultQueryMiddleware|MongooseDefaultQueryMiddleware[], fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = Query<any, any>>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPostOptions, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: false, query: true }, fn: ErrorHandlingMiddlewareFunction<T>): this;
// this = Union of Document and Query, could be called with any of them
post<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPostOptions & { document: true, query: true }, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, fn: ErrorHandlingMiddlewareFunction<T>): this;
// method aggregate and insertMany with PostMiddlewareFunction
post<T extends Aggregate<any>>(method: 'aggregate' | RegExp, fn: PostMiddlewareFunction<T, Array<AggregateExtract<T>>>): this;
post<T extends Aggregate<any>>(method: 'aggregate' | RegExp, options: SchemaPostOptions, fn: PostMiddlewareFunction<T, Array<AggregateExtract<T>>>): this;
post<T = TModelType>(method: 'insertMany' | RegExp, fn: PostMiddlewareFunction<T, T>): this;
post<T = TModelType>(method: 'insertMany' | RegExp, options: SchemaPostOptions, fn: PostMiddlewareFunction<T, T>): this;
// method aggregate and insertMany with ErrorHandlingMiddlewareFunction
post<T extends Aggregate<any>>(method: 'aggregate' | RegExp, fn: ErrorHandlingMiddlewareFunction<T, Array<any>>): this;
post<T extends Aggregate<any>>(method: 'aggregate' | RegExp, options: SchemaPostOptions, fn: ErrorHandlingMiddlewareFunction<T, Array<any>>): this;
post<T = TModelType>(method: 'bulkWrite' | 'createCollection' | 'insertMany' | RegExp, fn: ErrorHandlingMiddlewareFunction<T>): this;
post<T = TModelType>(method: 'bulkWrite' | 'createCollection' | 'insertMany' | RegExp, options: SchemaPostOptions, fn: ErrorHandlingMiddlewareFunction<T>): this;
/** Defines a pre hook for the model. */
// this = never since it never happens
pre<T = never>(method: 'save', options: SchemaPreOptions & { document: false, query: boolean }, fn: PreSaveMiddlewareFunction<T>): this;
pre<T = never>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPreOptions & { document: false, query: false }, fn: PreMiddlewareFunction<T>): this;
pre<T = never>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPreOptions & { document: boolean, query: false }, fn: PreMiddlewareFunction<T>): this;
pre<T = never>(method: MongooseDistinctDocumentMiddleware | MongooseDistinctDocumentMiddleware[] | RegExp, options: SchemaPreOptions & { document: false, query: boolean }, fn: PreMiddlewareFunction<T>): this;
// this = Union of Document and Query, could be called with any of them
pre<T = THydratedDocumentType | Query<any, any>>(
method: MongooseQueryAndDocumentMiddleware | MongooseQueryAndDocumentMiddleware[] | RegExp,
options: SchemaPreOptions & { document: true, query: true },
fn: PreMiddlewareFunction<T>
): this;
// this = Document
pre<T = THydratedDocumentType>(method: 'save', fn: PreSaveMiddlewareFunction<T>): this;
pre<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], fn: PreMiddlewareFunction<T>): this;
pre<T = THydratedDocumentType>(method: MongooseDistinctDocumentMiddleware|MongooseDistinctDocumentMiddleware[], options: SchemaPreOptions, fn: PreMiddlewareFunction<T>): this;
pre<T = THydratedDocumentType>(
method: MongooseQueryAndDocumentMiddleware | MongooseQueryAndDocumentMiddleware[] | RegExp,
options: SchemaPreOptions & { document: true },
fn: PreMiddlewareFunction<T>
): this;
pre<T = THydratedDocumentType>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPreOptions & { document: true, query: false }, fn: PreMiddlewareFunction<T>): this;
// this = Query
pre<T = Query<any, any>>(method: MongooseDefaultQueryMiddleware|MongooseDefaultQueryMiddleware[], fn: PreMiddlewareFunction<T>): this;
pre<T = Query<any, any>>(method: MongooseDistinctQueryMiddleware|MongooseDistinctQueryMiddleware[], options: SchemaPreOptions, fn: PreMiddlewareFunction<T>): this;
pre<T = Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPreOptions & { document: false, query: true }, fn: PreMiddlewareFunction<T>): this;
// this = Union of Document and Query, could be called with any of them
pre<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, options: SchemaPreOptions & { document: true, query: true }, fn: PreMiddlewareFunction<T>): this;
pre<T = THydratedDocumentType|Query<any, any>>(method: MongooseQueryOrDocumentMiddleware | MongooseQueryOrDocumentMiddleware[] | RegExp, fn: PreMiddlewareFunction<T>): this;
// method aggregate
pre<T extends Aggregate<any>>(method: 'aggregate' | RegExp, fn: PreMiddlewareFunction<T>): this;
/* method insertMany */
pre<T = TModelType>(
method: 'insertMany' | RegExp,
fn: (
this: T,
next: (err?: CallbackError) => void,
docs: any | Array<any>,
options?: InsertManyOptions & { lean?: boolean }
) => void | Promise<void>
): this;
/* method bulkWrite */
pre<T = TModelType>(
method: 'bulkWrite' | RegExp,
fn: (
this: T,
next: (err?: CallbackError) => void,
ops: Array<AnyBulkWriteOperation<any>>,
options?: mongodb.BulkWriteOptions & MongooseBulkWriteOptions
) => void | Promise<void>
): this;
/* method createCollection */
pre<T = TModelType>(
method: 'createCollection' | RegExp,
fn: (
this: T,
next: (err?: CallbackError) => void,
options?: mongodb.CreateCollectionOptions & Pick<SchemaOptions, 'expires'>
) => void | Promise<void>
): this;
/** Object of currently defined query helpers on this schema. */
query: TQueryHelpers;
/** Adds a method call to the queue. */
queue(name: string, args: any[]): this;
/** Removes the given `path` (or [`paths`]). */
remove(paths: string | Array<string>): this;
/** Removes index by name or index spec */
removeIndex(index: string | AnyObject): this;
/** Returns an Array of path strings that are required by this schema. */
requiredPaths(invalidate?: boolean): string[];
/** Sets a schema option. */
set<K extends keyof SchemaOptions>(key: K, value: SchemaOptions[K], _tags?: any): this;
/** Adds static "class" methods to Models compiled from this schema. */
static<K extends keyof TStaticMethods>(name: K, fn: TStaticMethods[K]): this;
static(obj: { [F in keyof TStaticMethods]: TStaticMethods[F] } & { [name: string]: (this: TModelType, ...args: any[]) => any }): this;
static(name: string, fn: (this: TModelType, ...args: any[]) => any): this;
/** Object of currently defined statics on this schema. */
statics: { [F in keyof TStaticMethods]: TStaticMethods[F] } &
{ [name: string]: (this: TModelType, ...args: any[]) => unknown };
toJSONSchema(options?: { useBsonType?: boolean }): Record<string, any>;
/** Creates a virtual type with the given name. */
virtual<T = HydratedDocument<DocType, TVirtuals & TInstanceMethods, TQueryHelpers>>(
name: keyof TVirtuals | string,
options?: VirtualTypeOptions<T, DocType>
): VirtualType<T>;
/** Object of currently defined virtuals on this schema */
virtuals: TVirtuals;
/** Returns the virtual type with the given `name`. */
virtualpath<T = THydratedDocumentType>(name: string): VirtualType<T> | null;
static ObjectId: typeof Schema.Types.ObjectId;
}
export type NumberSchemaDefinition = typeof Number | 'number' | 'Number' | typeof Schema.Types.Number;
export type StringSchemaDefinition = typeof String | 'string' | 'String' | typeof Schema.Types.String;
export type BooleanSchemaDefinition = typeof Boolean | 'boolean' | 'Boolean' | typeof Schema.Types.Boolean;
export type DateSchemaDefinition = DateConstructor | 'date' | 'Date' | typeof Schema.Types.Date;
export type ObjectIdSchemaDefinition = 'ObjectId' | 'ObjectID' | typeof Schema.Types.ObjectId;
export type SchemaDefinitionWithBuiltInClass<T> = T extends number
? NumberSchemaDefinition
: T extends string
? StringSchemaDefinition
: T extends boolean
? BooleanSchemaDefinition
: T extends NativeDate
? DateSchemaDefinition
: (Function | string);
export type SchemaDefinitionProperty<T = undefined, EnforcedDocType = any, THydratedDocumentType = HydratedDocument<EnforcedDocType>> = SchemaDefinitionWithBuiltInClass<T>
| SchemaTypeOptions<T extends undefined ? any : T, EnforcedDocType, THydratedDocumentType>
| typeof SchemaType
| Schema<any, any, any>
| Schema<any, any, any>[]
| SchemaTypeOptions<T extends undefined ? any : Unpacked<T>, EnforcedDocType, THydratedDocumentType>[]
| Function[]
| SchemaDefinition<T, EnforcedDocType, THydratedDocumentType>
| SchemaDefinition<Unpacked<T>, EnforcedDocType, THydratedDocumentType>[]
| typeof Schema.Types.Mixed
| MixedSchemaTypeOptions<EnforcedDocType>;
export type SchemaDefinition<T = undefined, EnforcedDocType = any, THydratedDocumentType = HydratedDocument<EnforcedDocType>> = T extends undefined
? { [path: string]: SchemaDefinitionProperty; }
: { [path in keyof T]?: SchemaDefinitionProperty<T[path], EnforcedDocType, THydratedDocumentType>; };
export type AnyArray<T> = T[] | ReadonlyArray<T>;
export type ExtractMongooseArray<T> = T extends Types.Array<any> ? AnyArray<Unpacked<T>> : T;
export interface MixedSchemaTypeOptions<EnforcedDocType> extends SchemaTypeOptions<Schema.Types.Mixed, EnforcedDocType> {
type: typeof Schema.Types.Mixed;
}
export type RefType =
| number
| string
| Buffer
| undefined
| Types.ObjectId
| Types.Buffer
| typeof Schema.Types.Number
| typeof Schema.Types.String
| typeof Schema.Types.Buffer
| typeof Schema.Types.ObjectId
| typeof Schema.Types.UUID;
export type InferId<T> = T extends { _id?: any } ? T['_id'] : Types.ObjectId;
export interface VirtualTypeOptions<HydratedDocType = Document, DocType = unknown> {
/** If `ref` is not nullish, this becomes a populated virtual. */
ref?: string | Function;
/** The local field to populate on if this is a populated virtual. */
localField?: string | ((this: HydratedDocType, doc: HydratedDocType) => string);
/** The foreign field to populate on if this is a populated virtual. */
foreignField?: string | ((this: HydratedDocType, doc: HydratedDocType) => string);
/**
* By default, a populated virtual is an array. If you set `justOne`,
* the populated virtual will be a single doc or `null`.
*/
justOne?: boolean;
/** If you set this to `true`, Mongoose will call any custom getters you defined on this virtual. */
getters?: boolean;
/**
* If you set this to `true`, `populate()` will set this virtual to the number of populated
* documents, as opposed to the documents themselves, using `Query#countDocuments()`.
*/
count?: boolean;
/** Add an extra match condition to `populate()`. */
match?: FilterQuery<any> | ((doc: Record<string, any>, virtual?: this) => Record<string, any> | null);
/** Add a default `limit` to the `populate()` query. */
limit?: number;
/** Add a default `skip` to the `populate()` query. */
skip?: number;
/**
* For legacy reasons, `limit` with `populate()` may give incorrect results because it only
* executes a single query for every document being populated. If you set `perDocumentLimit`,
* Mongoose will ensure correct `limit` per document by executing a separate query for each
* document to `populate()`. For example, `.find().populate({ path: 'test', perDocumentLimit: 2 })`
* will execute 2 additional queries if `.find()` returns 2 documents.
*/
perDocumentLimit?: number;
/** Additional options like `limit` and `lean`. */
options?: QueryOptions<DocType> & { match?: AnyObject };
/** If true and the given `name` is a direct child of an array, apply the virtual to the array rather than the elements. */
applyToArray?: boolean;
/** Additional options for plugins */
[extra: string]: any;
}
export class VirtualType<HydratedDocType> {
/** Applies getters to `value`. */
applyGetters(value: any, doc: Document): any;
/** Applies setters to `value`. */
applySetters(value: any, doc: Document): any;
/** Adds a custom getter to this virtual. */
get<T = HydratedDocType>(fn: (this: T, value: any, virtualType: VirtualType<T>, doc: T) => any): this;
/** Adds a custom setter to this virtual. */
set<T = HydratedDocType>(fn: (this: T, value: any, virtualType: VirtualType<T>, doc: T) => void): this;
}
export type ReturnsNewDoc = { new: true } | { returnOriginal: false } | { returnDocument: 'after' };
export type ProjectionElementType = number | string;
export type ProjectionType<T> = { [P in keyof T]?: ProjectionElementType } | AnyObject | string;
export type SortValues = SortOrder;
export type SortOrder = -1 | 1 | 'asc' | 'ascending' | 'desc' | 'descending';
type _UpdateQuery<TSchema, AdditionalProperties = AnyObject> = {
/** @see https://www.mongodb.com/docs/manual/reference/operator/update-field/ */
$currentDate?: AnyKeys<TSchema> & AdditionalProperties;
$inc?: AnyKeys<TSchema> & AdditionalProperties;
$min?: AnyKeys<TSchema> & AdditionalProperties;
$max?: AnyKeys<TSchema> & AdditionalProperties;
$mul?: AnyKeys<TSchema> & AdditionalProperties;
$rename?: Record<string, string>;
$set?: AnyKeys<TSchema> & AdditionalProperties;
$setOnInsert?: AnyKeys<TSchema> & AdditionalProperties;
$unset?: AnyKeys<TSchema> & AdditionalProperties;
/** @see https://www.mongodb.com/docs/manual/reference/operator/update-array/ */
$addToSet?: AnyKeys<TSchema> & AdditionalProperties;
$pop?: AnyKeys<TSchema> & AdditionalProperties;
$pull?: AnyKeys<TSchema> & AdditionalProperties;
$push?: AnyKeys<TSchema> & AdditionalProperties;
$pullAll?: AnyKeys<TSchema> & AdditionalProperties;
/** @see https://www.mongodb.com/docs/manual/reference/operator/update-bitwise/ */
$bit?: AnyKeys<TSchema>;
};
export type UpdateWithAggregationPipeline = UpdateAggregationStage[];
export type UpdateAggregationStage = { $addFields: any } |
{ $set: any } |
{ $project: any } |
{ $unset: any } |
{ $replaceRoot: any } |
{ $replaceWith: any };
/**
* Update query command to perform on the document
* @example
* ```js
* { age: 30 }
* ```
*/
export type UpdateQuery<T> = AnyKeys<T> & _UpdateQuery<T> & AnyObject;
/**
* A more strict form of UpdateQuery that enforces updating only
* known top-level properties.
* @example
* ```ts
* function updateUser(_id: mongoose.Types.ObjectId, update: UpdateQueryKnownOnly<IUser>) {
* return User.updateOne({ _id }, update);
* }
* ```
*/
export type UpdateQueryKnownOnly<T> = _UpdateQuery<T, {}>;
export type FlattenMaps<T> = {
[K in keyof T]: FlattenProperty<T[K]>;
};
export type BufferToBinaryProperty<T> = unknown extends Buffer
? T
: T extends Buffer
? mongodb.Binary
: T extends Types.DocumentArray<infer ItemType>
? Types.DocumentArray<BufferToBinary<ItemType>>
: T extends Types.Subdocument<unknown, unknown, infer SubdocType>
? HydratedSingleSubdocument<BufferToBinary<SubdocType>>
: BufferToBinary<T>;
/**
* Converts any Buffer properties into mongodb.Binary instances, which is what `lean()` returns
*/
export type BufferToBinary<T> = unknown extends Buffer
? T
: T extends Buffer
? mongodb.Binary
: T extends Document
? T
: T extends TreatAsPrimitives
? T
: T extends Record<string, any>
? {
[K in keyof T]: BufferToBinaryProperty<T[K]>
}
: T;
/**
* Converts any Buffer properties into { type: 'buffer', data: [1, 2, 3] } format for JSON serialization
*/
export type BufferToJSON<T> = unknown extends Buffer
? T
: T extends Buffer
? { type: 'buffer', data: number[] }
: T extends Document
? T
: T extends TreatAsPrimitives
? T
: T extends Record<string, any> ? {
[K in keyof T]: T[K] extends Buffer
? { type: 'buffer', data: number[] }
: T[K] extends Types.DocumentArray<infer ItemType>
? Types.DocumentArray<BufferToBinary<ItemType>>
: T[K] extends Types.Subdocument<unknown, unknown, infer SubdocType>
? HydratedSingleSubdocument<SubdocType>
: BufferToBinary<T[K]>;
} : T;
/**
* Converts any ObjectId properties into strings for JSON serialization
*/
export type ObjectIdToString<T> = T extends mongodb.ObjectId
? string
: T extends Document
? T
: T extends TreatAsPrimitives
? T
: T extends Record<string, any> ? {
[K in keyof T]: T[K] extends mongodb.ObjectId
? string
: T[K] extends Types.DocumentArray<infer ItemType>
? Types.DocumentArray<ObjectIdToString<ItemType>>
: T[K] extends Types.Subdocument<unknown, unknown, infer SubdocType>
? HydratedSingleSubdocument<ObjectIdToString<SubdocType>>
: ObjectIdToString<T[K]>;
} : T;
/**
* Converts any Date properties into strings for JSON serialization
*/
export type DateToString<T> = T extends NativeDate
? string
: T extends Document
? T
: T extends TreatAsPrimitives
? T
: T extends Record<string, any> ? {
[K in keyof T]: T[K] extends NativeDate
? string
: T[K] extends (NativeDate | null | undefined)
? string | null | undefined
: T[K] extends Types.DocumentArray<infer ItemType>
? Types.DocumentArray<DateToString<ItemType>>
: T[K] extends Types.Subdocument<unknown, unknown, infer SubdocType>
? HydratedSingleSubdocument<DateToString<SubdocType>>
: DateToString<T[K]>;
} : T;
/**
* Converts any Mongoose subdocuments (single nested or doc arrays) into POJO equivalents
*/
export type SubdocsToPOJOs<T> = T extends Document
? T
: T extends TreatAsPrimitives
? T
: T extends Record<string, any> ? {
[K in keyof T]: T[K] extends Types.DocumentArray<infer ItemType>
? ItemType[]
: T[K] extends Types.Subdocument<unknown, unknown, infer SubdocType>
? SubdocType
: SubdocsToPOJOs<T[K]>;
} : T;
export type JSONSerialized<T> = SubdocsToPOJOs<
FlattenMaps<
BufferToJSON<
ObjectIdToString<
DateToString<T>
>
>
>
>;
/**
* Separate type is needed for properties of union type (for example, Types.DocumentArray | undefined) to apply conditional check to each member of it
* https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types
*/
type FlattenProperty<T> = T extends Map<any, infer V>
? Record<string, V> : T extends TreatAsPrimitives
? T : T extends Types.DocumentArray<infer ItemType>
? Types.DocumentArray<FlattenMaps<ItemType>> : FlattenMaps<T>;
export type actualPrimitives = string | boolean | number | bigint | symbol | null | undefined;
export type TreatAsPrimitives = actualPrimitives | NativeDate | RegExp | symbol | Error | BigInt | Types.ObjectId | Buffer | Function | mongodb.Binary | mongodb.ClientSession;
export type SchemaDefinitionType<T> = T extends Document ? Omit<T, Exclude<keyof Document, '_id' | 'id' | '__v'>> : T;
/**
* Helper to choose the best option between two type helpers
*/
export type _pickObject<T1, T2, Fallback> = T1 extends false ? T2 extends false ? Fallback : T2 : T1;
/* for ts-mongoose */
export class mquery { }
export function overwriteMiddlewareResult(val: any): Kareem.OverwriteMiddlewareResult;
export function skipMiddlewareFunction(val: any): Kareem.SkipWrappedFunction;
export default mongoose;
}