2019-02-01 14:06:44 +01:00
'use strict' ;
/ * !
* Module dependencies .
* /
if ( global . MONGOOSE _DRIVER _PATH ) {
2019-06-04 14:29:48 +02:00
const deprecationWarning = 'The `MONGOOSE_DRIVER_PATH` global property is ' +
'deprecated. Use `mongoose.driver.set()` instead.' ;
const setDriver = require ( 'util' ) . deprecate ( function ( ) {
require ( './driver' ) . set ( require ( global . MONGOOSE _DRIVER _PATH ) ) ;
} , deprecationWarning ) ;
setDriver ( ) ;
2019-02-01 14:06:44 +01:00
} else {
require ( './driver' ) . set ( require ( './drivers/node-mongodb-native' ) ) ;
}
const Schema = require ( './schema' ) ;
const SchemaType = require ( './schematype' ) ;
const SchemaTypes = require ( './schema/index' ) ;
const VirtualType = require ( './virtualtype' ) ;
const STATES = require ( './connectionstate' ) ;
const Types = require ( './types' ) ;
const Query = require ( './query' ) ;
const Model = require ( './model' ) ;
const Document = require ( './document' ) ;
2019-06-04 14:29:48 +02:00
const applyPlugins = require ( './helpers/schema/applyPlugins' ) ;
2019-04-17 15:58:15 +02:00
const get = require ( './helpers/get' ) ;
2019-02-01 14:06:44 +01:00
const legacyPluralize = require ( 'mongoose-legacy-pluralize' ) ;
const utils = require ( './utils' ) ;
const pkg = require ( '../package.json' ) ;
const removeSubdocs = require ( './plugins/removeSubdocs' ) ;
const saveSubdocs = require ( './plugins/saveSubdocs' ) ;
const validateBeforeSave = require ( './plugins/validateBeforeSave' ) ;
const Aggregate = require ( './aggregate' ) ;
const PromiseProvider = require ( './promise_provider' ) ;
const shardingPlugin = require ( './plugins/sharding' ) ;
const defaultMongooseSymbol = Symbol . for ( 'mongoose:default' ) ;
require ( './helpers/printJestWarning' ) ;
/ * *
* Mongoose constructor .
*
* The exports object of the ` mongoose ` module is an instance of this class .
* Most apps will only use this one instance .
*
* @ api public
* /
function Mongoose ( options ) {
this . connections = [ ] ;
this . models = { } ;
this . modelSchemas = { } ;
// default global options
this . options = {
pluralization : true
} ;
const conn = this . createConnection ( ) ; // default connection
conn . models = this . models ;
this . _pluralize = legacyPluralize ;
// If a user creates their own Mongoose instance, give them a separate copy
// of the `Schema` constructor so they get separate custom types. (gh-6933)
if ( ! options || ! options [ defaultMongooseSymbol ] ) {
const _this = this ;
this . Schema = function ( ) {
this . base = _this ;
return Schema . apply ( this , arguments ) ;
} ;
this . Schema . prototype = Object . create ( Schema . prototype ) ;
Object . assign ( this . Schema , Schema ) ;
this . Schema . base = this ;
this . Schema . Types = Object . assign ( { } , Schema . Types ) ;
} else {
// Hack to work around babel's strange behavior with
// `import mongoose, { Schema } from 'mongoose'`. Because `Schema` is not
// an own property of a Mongoose global, Schema will be undefined. See gh-5648
for ( const key of [ 'Schema' , 'model' ] ) {
this [ key ] = Mongoose . prototype [ key ] ;
}
}
this . Schema . prototype . base = this ;
Object . defineProperty ( this , 'plugins' , {
configurable : false ,
enumerable : true ,
writable : false ,
value : [
[ saveSubdocs , { deduplicate : true } ] ,
[ validateBeforeSave , { deduplicate : true } ] ,
[ shardingPlugin , { deduplicate : true } ] ,
[ removeSubdocs , { deduplicate : true } ]
]
} ) ;
}
/ * *
* Expose connection states for user - land
*
* @ memberOf Mongoose
* @ property STATES
* @ api public
* /
Mongoose . prototype . STATES = STATES ;
2019-06-04 14:29:48 +02:00
/ * *
* The underlying driver this Mongoose instance uses to communicate with
* the database . A driver is a Mongoose - specific interface that defines functions
* like ` find() ` .
*
* @ memberOf Mongoose
* @ property driver
* @ api public
* /
Mongoose . prototype . driver = require ( './driver' ) ;
2019-02-01 14:06:44 +01:00
/ * *
* Sets mongoose options
*
* # # # # Example :
*
* mongoose . set ( 'test' , value ) // sets the 'test' option to `value`
*
* mongoose . set ( 'debug' , true ) // enable logging collection methods + arguments to the console
*
* mongoose . set ( 'debug' , function ( collectionName , methodName , arg1 , arg2 ... ) { } ) ; // use custom function to log collection methods + arguments
*
* Currently supported options are :
* - 'debug' : prints the operations mongoose sends to MongoDB to the console
* - 'bufferCommands' : enable / disable mongoose ' s buffering mechanism for all connections and models
* - 'useCreateIndex' : false by default . Set to ` true ` to make Mongoose ' s default index build use ` createIndex() ` instead of ` ensureIndex() ` to avoid deprecation warnings from the MongoDB driver .
* - 'useFindAndModify' : true by default . Set to ` false ` to make ` findOneAndUpdate() ` and ` findOneAndRemove() ` use native ` findOneAndUpdate() ` rather than ` findAndModify() ` .
* - 'useNewUrlParser' : false by default . Set to ` true ` to make all connections set the ` useNewUrlParser ` option by default
* - 'cloneSchemas' : false by default . Set to ` true ` to ` clone() ` all schemas before compiling into a model .
* - 'applyPluginsToDiscriminators' : false by default . Set to true to apply global plugins to discriminator schemas . This typically isn ' t necessary because plugins are applied to the base schema and discriminators copy all middleware , methods , statics , and properties from the base schema .
* - 'objectIdGetter' : true by default . Mongoose adds a getter to MongoDB ObjectId ' s called ` _id ` that returns ` this ` for convenience with populate . Set this to false to remove the getter .
* - 'runValidators' : false by default . Set to true to enable [ update validators ] ( / d o c s / v a l i d a t i o n . h t m l # u p d a t e - v a l i d a t o r s ) f o r a l l v a l i d a t o r s b y d e f a u l t .
* - 'toObject' : ` { transform: true, flattenDecimals: true } ` by default . Overwrites default objects to [ ` toObject() ` ] ( / d o c s / a p i . h t m l # d o c u m e n t _ D o c u m e n t - t o O b j e c t )
* - 'toJSON' : ` { transform: true, flattenDecimals: true } ` by default . Overwrites default objects to [ ` toJSON() ` ] ( / d o c s / a p i . h t m l # d o c u m e n t _ D o c u m e n t - t o J S O N ) , f o r d e t e r m i n i n g h o w M o n g o o s e d o c u m e n t s g e t s e r i a l i z e d b y ` J S O N . s t r i n g i f y ( ) `
* - 'strict' : true by default , may be ` false ` , ` true ` , or ` 'throw' ` . Sets the default strict mode for schemas .
* - 'selectPopulatedPaths' : true by default . Set to false to opt out of Mongoose adding all fields that you ` populate() ` to your ` select() ` . The schema - level option ` selectPopulatedPaths ` overwrites this one .
*
* @ param { String } key
* @ param { String | Function | Boolean } value
* @ api public
* /
Mongoose . prototype . set = function ( key , value ) {
if ( arguments . length === 1 ) {
return this . options [ key ] ;
}
this . options [ key ] = value ;
if ( key === 'objectIdGetter' ) {
if ( value ) {
Object . defineProperty ( mongoose . Types . ObjectId . prototype , '_id' , {
enumerable : false ,
configurable : true ,
get : function ( ) {
return this ;
}
} ) ;
} else {
delete mongoose . Types . ObjectId . prototype . _id ;
}
}
return this ;
} ;
/ * *
* Gets mongoose options
*
* # # # # Example :
*
* mongoose . get ( 'test' ) // returns the 'test' value
*
* @ param { String } key
* @ method get
* @ api public
* /
Mongoose . prototype . get = Mongoose . prototype . set ;
/ * *
* Creates a Connection instance .
*
* Each ` connection ` instance maps to a single database . This method is helpful when mangaging multiple db connections .
*
*
* _Options passed take precedence over options included in connection strings . _
*
* # # # # Example :
*
* // with mongodb:// URI
* db = mongoose . createConnection ( 'mongodb://user:pass@localhost:port/database' ) ;
*
* // and options
* var opts = { db : { native _parser : true } }
* db = mongoose . createConnection ( 'mongodb://user:pass@localhost:port/database' , opts ) ;
*
* // replica sets
* db = mongoose . createConnection ( 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/database' ) ;
*
* // and options
* var opts = { replset : { strategy : 'ping' , rs _name : 'testSet' } }
* db = mongoose . createConnection ( 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/database' , opts ) ;
*
* // and options
* var opts = { server : { auto _reconnect : false } , user : 'username' , pass : 'mypassword' }
* db = mongoose . createConnection ( 'localhost' , 'database' , port , opts )
*
* // initialize now, connect later
* db = mongoose . createConnection ( ) ;
* db . openUri ( 'localhost' , 'database' , port , [ opts ] ) ;
*
* @ param { String } [ uri ] a mongodb : // URI
* @ param { Object } [ options ] passed down to the [ MongoDB driver ' s ` connect() ` function ] ( http : //mongodb.github.io/node-mongodb-native/3.0/api/MongoClient.html), except for 4 mongoose-specific options explained below.
* @ param { String } [ options . user ] username for authentication , equivalent to ` options.auth.user ` . Maintained for backwards compatibility .
* @ param { String } [ options . pass ] password for authentication , equivalent to ` options.auth.password ` . Maintained for backwards compatibility .
* @ param { Boolean } [ options . autoIndex = true ] Mongoose - specific option . Set to false to disable automatic index creation for all models associated with this connection .
* @ param { Boolean } [ options . bufferCommands = true ] Mongoose specific option . Set to false to [ disable buffering ] ( http : //mongoosejs.com/docs/faq.html#callback_never_executes) on all models associated with this connection.
* @ return { Connection } the created Connection object . Connections are thenable , so you can do ` await mongoose.createConnection() `
* @ api public
* /
Mongoose . prototype . createConnection = function ( uri , options , callback ) {
const conn = new Connection ( this ) ;
if ( typeof options === 'function' ) {
callback = options ;
options = null ;
}
this . connections . push ( conn ) ;
if ( arguments . length > 0 ) {
return conn . openUri ( uri , options , callback ) ;
}
return conn ;
} ;
/ * *
* Opens the default mongoose connection .
*
* # # # # Example :
*
* mongoose . connect ( 'mongodb://user:pass@localhost:port/database' ) ;
*
* // replica sets
* var uri = 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/mydatabase' ;
* mongoose . connect ( uri ) ;
*
* // with options
* mongoose . connect ( uri , options ) ;
*
* // optional callback that gets fired when initial connection completed
* var uri = 'mongodb://nonexistent.domain:27000' ;
* mongoose . connect ( uri , function ( error ) {
* // if error is truthy, the initial connection failed.
* } )
*
* @ param { String } uri ( s )
* @ param { Object } [ options ] passed down to the [ MongoDB driver ' s ` connect() ` function ] ( http : //mongodb.github.io/node-mongodb-native/3.0/api/MongoClient.html), except for 4 mongoose-specific options explained below.
* @ param { String } [ options . dbName ] The name of the database we want to use . If not provided , use database name from connection string .
* @ param { String } [ options . user ] username for authentication , equivalent to ` options.auth.user ` . Maintained for backwards compatibility .
* @ param { String } [ options . pass ] password for authentication , equivalent to ` options.auth.password ` . Maintained for backwards compatibility .
* @ param { Boolean } [ options . autoIndex = true ] Mongoose - specific option . Set to false to disable automatic index creation for all models associated with this connection .
* @ param { Boolean } [ options . bufferCommands = true ] Mongoose specific option . Set to false to [ disable buffering ] ( http : //mongoosejs.com/docs/faq.html#callback_never_executes) on all models associated with this connection.
* @ param { Boolean } [ options . useCreateIndex = true ] Mongoose - specific option . If ` true ` , this connection will use [ ` createIndex() ` instead of ` ensureIndex() ` ] ( / d o c s / d e p r e c a t i o n s . h t m l # - e n s u r e i n d e x - ) f o r a u t o m a t i c i n d e x b u i l d s v i a [ ` M o d e l . i n i t ( ) ` ] ( / d o c s / a p i . h t m l # m o d e l _ M o d e l . i n i t ) .
* @ param { Boolean } [ options . useFindAndModify = true ] True by default . Set to ` false ` to make ` findOneAndUpdate() ` and ` findOneAndRemove() ` use native ` findOneAndUpdate() ` rather than ` findAndModify() ` .
* @ param { Boolean } [ options . useNewUrlParser = false ] False by default . Set to ` true ` to make all connections set the ` useNewUrlParser ` option by default .
* @ param { Function } [ callback ]
* @ see Mongoose # createConnection # index _Mongoose - createConnection
* @ api public
* @ return { Promise } resolves to ` this ` if connection succeeded
* /
Mongoose . prototype . connect = function ( ) {
const _mongoose = this instanceof Mongoose ? this : mongoose ;
const conn = _mongoose . connection ;
return conn . openUri ( arguments [ 0 ] , arguments [ 1 ] , arguments [ 2 ] ) . then ( ( ) => _mongoose ) ;
} ;
/ * *
* Runs ` .close() ` on all connections in parallel .
*
* @ param { Function } [ callback ] called after all connection close , or when first error occurred .
* @ return { Promise } resolves when all connections are closed , or rejects with the first error that occurred .
* @ api public
* /
Mongoose . prototype . disconnect = function ( callback ) {
return utils . promiseOrCallback ( callback , cb => {
let remaining = this . connections . length ;
if ( remaining <= 0 ) {
return cb ( null ) ;
}
this . connections . forEach ( conn => {
conn . close ( function ( error ) {
if ( error ) {
return cb ( error ) ;
}
if ( ! -- remaining ) {
cb ( null ) ;
}
} ) ;
} ) ;
} ) ;
} ;
/ * *
* _Requires MongoDB >= 3.6 . 0. _ Starts a [ MongoDB session ] ( https : //docs.mongodb.com/manual/release-notes/3.6/#client-sessions)
* for benefits like causal consistency , [ retryable writes ] ( https : //docs.mongodb.com/manual/core/retryable-writes/),
* and [ transactions ] ( http : //thecodebarbarian.com/a-node-js-perspective-on-mongodb-4-transactions.html).
*
* Calling ` mongoose.startSession() ` is equivalent to calling ` mongoose.connection.startSession() ` .
* Sessions are scoped to a connection , so calling ` mongoose.startSession() `
* starts a session on the [ default mongoose connection ] ( / d o c s / a p i . h t m l # m o n g o o s e _ M o n g o o s e - c o n n e c t i o n ) .
*
* @ param { Object } [ options ] see the [ mongodb driver options ] ( http : //mongodb.github.io/node-mongodb-native/3.0/api/MongoClient.html#startSession)
* @ param { Boolean } [ options . causalConsistency = true ] set to false to disable causal consistency
* @ param { Function } [ callback ]
* @ return { Promise < ClientSession > } promise that resolves to a MongoDB driver ` ClientSession `
* @ api public
* /
Mongoose . prototype . startSession = function ( ) {
return this . connection . startSession . apply ( this . connection , arguments ) ;
} ;
/ * *
* Getter / setter around function for pluralizing collection names .
*
* @ param { Function | null } [ fn ] overwrites the function used to pluralize collection names
* @ return { Function | null } the current function used to pluralize collection names , defaults to the legacy function from ` mongoose-legacy-pluralize ` .
* @ api public
* /
Mongoose . prototype . pluralize = function ( fn ) {
if ( arguments . length > 0 ) {
this . _pluralize = fn ;
}
return this . _pluralize ;
} ;
/ * *
* Defines a model or retrieves it .
*
* Models defined on the ` mongoose ` instance are available to all connection
* created by the same ` mongoose ` instance .
*
* If you call ` mongoose.model() ` with twice the same name but a different schema ,
* you will get an ` OverwriteModelError ` . If you call ` mongoose.model() ` with
* the same name and same schema , you ' ll get the same schema back .
*
* # # # # Example :
*
* var mongoose = require ( 'mongoose' ) ;
*
* // define an Actor model with this mongoose instance
* const Schema = new Schema ( { name : String } ) ;
* mongoose . model ( 'Actor' , schema ) ;
*
* // create a new connection
* var conn = mongoose . createConnection ( . . ) ;
*
* // create Actor model
* var Actor = conn . model ( 'Actor' , schema ) ;
* conn . model ( 'Actor' ) === Actor ; // true
* conn . model ( 'Actor' , schema ) === Actor ; // true, same schema
* conn . model ( 'Actor' , schema , 'actors' ) === Actor ; // true, same schema and collection name
*
* // This throws an `OverwriteModelError` because the schema is different.
* conn . model ( 'Actor' , new Schema ( { name : String } ) ) ;
*
* _When no ` collection ` argument is passed , Mongoose uses the model name . If you don ' t like this behavior , either pass a collection name , use ` mongoose.pluralize() ` , or set your schemas collection name option . _
*
* # # # # Example :
*
* var schema = new Schema ( { name : String } , { collection : 'actor' } ) ;
*
* // or
*
* schema . set ( 'collection' , 'actor' ) ;
*
* // or
*
* var collectionName = 'actor'
* var M = mongoose . model ( 'Actor' , schema , collectionName )
*
* @ param { String | Function } name model name or class extending Model
* @ param { Schema } [ schema ] the schema to use .
* @ param { String } [ collection ] name ( optional , inferred from model name )
* @ param { Boolean } [ skipInit ] whether to skip initialization ( defaults to false )
* @ return { Model } The model associated with ` name ` . Mongoose will create the model if it doesn ' t already exist .
* @ api public
* /
Mongoose . prototype . model = function ( name , schema , collection , skipInit ) {
const _mongoose = this instanceof Mongoose ? this : mongoose ;
let model ;
if ( typeof name === 'function' ) {
model = name ;
name = model . name ;
if ( ! ( model . prototype instanceof Model ) ) {
throw new _mongoose . Error ( 'The provided class ' + name + ' must extend Model' ) ;
}
}
if ( typeof schema === 'string' ) {
collection = schema ;
schema = false ;
}
if ( utils . isObject ( schema ) && ! ( schema . instanceOfSchema ) ) {
schema = new Schema ( schema ) ;
}
if ( schema && ! schema . instanceOfSchema ) {
throw new Error ( 'The 2nd parameter to `mongoose.model()` should be a ' +
'schema or a POJO' ) ;
}
if ( typeof collection === 'boolean' ) {
skipInit = collection ;
collection = null ;
}
// handle internal options from connection.model()
let options ;
if ( skipInit && utils . isObject ( skipInit ) ) {
options = skipInit ;
skipInit = true ;
} else {
options = { } ;
}
// look up schema for the collection.
if ( ! _mongoose . modelSchemas [ name ] ) {
if ( schema ) {
// cache it so we only apply plugins once
_mongoose . modelSchemas [ name ] = schema ;
} else {
throw new mongoose . Error . MissingSchemaError ( name ) ;
}
}
const originalSchema = schema ;
if ( schema ) {
if ( _mongoose . get ( 'cloneSchemas' ) ) {
schema = schema . clone ( ) ;
}
_mongoose . _applyPlugins ( schema ) ;
}
let sub ;
// connection.model() may be passing a different schema for
// an existing model name. in this case don't read from cache.
if ( _mongoose . models [ name ] && options . cache !== false ) {
if ( originalSchema &&
originalSchema . instanceOfSchema &&
originalSchema !== _mongoose . models [ name ] . schema ) {
throw new _mongoose . Error . OverwriteModelError ( name ) ;
}
if ( collection && collection !== _mongoose . models [ name ] . collection . name ) {
// subclass current model with alternate collection
model = _mongoose . models [ name ] ;
schema = model . prototype . schema ;
sub = model . _ _subclass ( _mongoose . connection , schema , collection ) ;
// do not cache the sub model
return sub ;
}
return _mongoose . models [ name ] ;
}
// ensure a schema exists
if ( ! schema ) {
schema = this . modelSchemas [ name ] ;
if ( ! schema ) {
throw new mongoose . Error . MissingSchemaError ( name ) ;
}
}
// Apply relevant "global" options to the schema
if ( ! ( 'pluralization' in schema . options ) ) {
schema . options . pluralization = _mongoose . options . pluralization ;
}
if ( ! collection ) {
collection = schema . get ( 'collection' ) ||
utils . toCollectionName ( name , _mongoose . pluralize ( ) ) ;
}
const connection = options . connection || _mongoose . connection ;
model = _mongoose . Model . compile ( model || name , schema , collection , connection , _mongoose ) ;
if ( ! skipInit ) {
// Errors handled internally, so safe to ignore error
model . init ( function $modelInitNoop ( ) { } ) ;
}
if ( options . cache === false ) {
return model ;
}
_mongoose . models [ name ] = model ;
return _mongoose . models [ name ] ;
} ;
/ * *
* 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 .
*
* Equivalent to ` mongoose.connection.deleteModel(name) ` .
*
* # # # # Example :
*
* mongoose . model ( 'User' , new Schema ( { name : String } ) ) ;
* console . log ( mongoose . model ( 'User' ) ) ; // Model object
* mongoose . deleteModel ( 'User' ) ;
* console . log ( mongoose . model ( 'User' ) ) ; // undefined
*
* // Usually useful in a Mocha `afterEach()` hook
* afterEach ( function ( ) {
* mongoose . deleteModel ( /.+/ ) ; // Delete every model
* } ) ;
*
* @ api public
* @ param { String | RegExp } name if string , the name of the model to remove . If regexp , removes all models whose name matches the regexp .
* @ return { Mongoose } this
* /
Mongoose . prototype . deleteModel = function ( name ) {
this . connection . deleteModel ( name ) ;
return this ;
} ;
/ * *
* Returns an array of model names created on this instance of Mongoose .
*
* # # # # Note :
*
* _Does not include names of models created using ` connection.model() ` . _
*
* @ api public
* @ return { Array }
* /
Mongoose . prototype . modelNames = function ( ) {
const names = Object . keys ( this . models ) ;
return names ;
} ;
/ * *
* Applies global plugins to ` schema ` .
*
* @ param { Schema } schema
* @ api private
* /
Mongoose . prototype . _applyPlugins = function ( schema , options ) {
2019-06-04 14:29:48 +02:00
options = options || { } ;
options . applyPluginsToDiscriminators = get ( this ,
2019-04-17 15:58:15 +02:00
'options.applyPluginsToDiscriminators' , false ) ;
2019-06-04 14:29:48 +02:00
applyPlugins ( schema , this . plugins , options , '$globalPluginsApplied' ) ;
2019-02-01 14:06:44 +01:00
} ;
/ * *
* Declares a global plugin executed on all Schemas .
*
* Equivalent to calling ` .plugin(fn) ` on each Schema you create .
*
* @ param { Function } fn plugin callback
* @ param { Object } [ opts ] optional options
* @ return { Mongoose } this
* @ see plugins . / plugins . html
* @ api public
* /
Mongoose . prototype . plugin = function ( fn , opts ) {
this . plugins . push ( [ fn , opts ] ) ;
return this ;
} ;
/ * *
2019-04-17 15:58:15 +02:00
* The Mongoose module ' s default connection . Equivalent to ` mongoose.connections][0] ` , see [ ` connections ` ] ( # mongoose _Mongoose - connections ) .
2019-02-01 14:06:44 +01:00
*
* # # # # Example :
*
* var mongoose = require ( 'mongoose' ) ;
* mongoose . connect ( ... ) ;
* mongoose . connection . on ( 'error' , cb ) ;
*
* This is the connection used by default for every model created using [ mongoose . model ] ( # index _Mongoose - model ) .
*
2019-04-17 15:58:15 +02:00
* To create a new connection , use [ ` createConnection() ` ] ( # mongoose _Mongoose - createConnection ) .
*
2019-02-01 14:06:44 +01:00
* @ memberOf Mongoose
* @ instance
2019-04-17 15:58:15 +02:00
* @ property { Connection } connection
2019-02-01 14:06:44 +01:00
* @ api public
* /
Mongoose . prototype . _ _defineGetter _ _ ( 'connection' , function ( ) {
return this . connections [ 0 ] ;
} ) ;
Mongoose . prototype . _ _defineSetter _ _ ( 'connection' , function ( v ) {
if ( v instanceof Connection ) {
this . connections [ 0 ] = v ;
this . models = v . models ;
}
} ) ;
2019-04-17 15:58:15 +02:00
/ * *
* An array containing all [ connections ] ( connections . html ) associated with this
* Mongoose instance . By default , there is 1 connection . Calling
* [ ` createConnection() ` ] ( # mongoose _Mongoose - createConnection ) adds a connection
* to this array .
*
* # # # # Example :
*
* const mongoose = require ( 'mongoose' ) ;
* mongoose . connections . length ; // 1, just the default connection
* mongoose . connections [ 0 ] === mongoose . connection ; // true
*
* mongoose . createConnection ( 'mongodb://localhost:27017/test' ) ;
* mongoose . connections . length ; // 2
*
* @ memberOf Mongoose
* @ instance
* @ property { Array } connections
* @ api public
* /
Mongoose . prototype . connections ;
2019-02-01 14:06:44 +01:00
/ * !
* Driver dependent APIs
* /
const driver = global . MONGOOSE _DRIVER _PATH || './drivers/node-mongodb-native' ;
/ * !
* Connection
* /
const Connection = require ( driver + '/connection' ) ;
/ * !
* Collection
* /
const Collection = require ( driver + '/collection' ) ;
/ * *
* The Mongoose Aggregate constructor
*
* @ method Aggregate
* @ api public
* /
Mongoose . prototype . Aggregate = Aggregate ;
/ * *
* The Mongoose Collection constructor
*
* @ method Collection
* @ api public
* /
Mongoose . prototype . Collection = Collection ;
/ * *
* The Mongoose [ Connection ] ( # connection _Connection ) constructor
*
* @ memberOf Mongoose
* @ instance
* @ method Connection
* @ api public
* /
Mongoose . prototype . Connection = Connection ;
/ * *
* The Mongoose version
*
* # # # # Example
*
* console . log ( mongoose . version ) ; // '5.x.x'
*
* @ property version
* @ api public
* /
Mongoose . prototype . version = pkg . version ;
/ * *
* The Mongoose constructor
*
* The exports of the mongoose module is an instance of this class .
*
* # # # # Example :
*
* var mongoose = require ( 'mongoose' ) ;
* var mongoose2 = new mongoose . Mongoose ( ) ;
*
* @ method Mongoose
* @ api public
* /
Mongoose . prototype . Mongoose = Mongoose ;
/ * *
* The Mongoose [ Schema ] ( # schema _Schema ) constructor
*
* # # # # Example :
*
* var mongoose = require ( 'mongoose' ) ;
* var Schema = mongoose . Schema ;
* var CatSchema = new Schema ( . . ) ;
*
* @ method Schema
* @ api public
* /
Mongoose . prototype . Schema = Schema ;
/ * *
* The Mongoose [ SchemaType ] ( # schematype _SchemaType ) constructor
*
* @ method SchemaType
* @ api public
* /
Mongoose . prototype . SchemaType = SchemaType ;
/ * *
* The various Mongoose SchemaTypes .
*
* # # # # Note :
*
* _Alias of mongoose . Schema . Types for backwards compatibility . _
*
* @ property SchemaTypes
* @ see Schema . SchemaTypes # schema _Schema . Types
* @ api public
* /
Mongoose . prototype . SchemaTypes = Schema . Types ;
/ * *
* The Mongoose [ VirtualType ] ( # virtualtype _VirtualType ) constructor
*
* @ method VirtualType
* @ api public
* /
Mongoose . prototype . VirtualType = VirtualType ;
/ * *
* The various Mongoose Types .
*
* # # # # Example :
*
* var mongoose = require ( 'mongoose' ) ;
* var array = mongoose . Types . Array ;
*
* # # # # Types :
*
* - [ ObjectId ] ( # types - objectid - js )
* - [ Buffer ] ( # types - buffer - js )
* - [ SubDocument ] ( # types - embedded - js )
* - [ Array ] ( # types - array - js )
* - [ DocumentArray ] ( # types - documentarray - js )
*
* Using this exposed access to the ` ObjectId ` type , we can construct ids on demand .
*
* var ObjectId = mongoose . Types . ObjectId ;
* var id1 = new ObjectId ;
*
* @ property Types
* @ api public
* /
Mongoose . prototype . Types = Types ;
/ * *
* The Mongoose [ Query ] ( # query _Query ) constructor .
*
* @ method Query
* @ api public
* /
Mongoose . prototype . Query = Query ;
/ * *
* The Mongoose [ Promise ] ( # promise _Promise ) constructor .
*
* @ memberOf Mongoose
* @ instance
* @ property Promise
* @ api public
* /
Object . defineProperty ( Mongoose . prototype , 'Promise' , {
get : function ( ) {
return PromiseProvider . get ( ) ;
} ,
set : function ( lib ) {
PromiseProvider . set ( lib ) ;
}
} ) ;
/ * *
* Storage layer for mongoose promises
*
* @ method PromiseProvider
* @ api public
* /
Mongoose . prototype . PromiseProvider = PromiseProvider ;
/ * *
* The Mongoose [ Model ] ( # model _Model ) constructor .
*
* @ method Model
* @ api public
* /
Mongoose . prototype . Model = Model ;
/ * *
* The Mongoose [ Document ] ( # document - js ) constructor .
*
* @ method Document
* @ api public
* /
Mongoose . prototype . Document = Document ;
/ * *
* The Mongoose DocumentProvider constructor . Mongoose users should not have to
* use this directly
*
* @ method DocumentProvider
* @ api public
* /
Mongoose . prototype . DocumentProvider = require ( './document_provider' ) ;
/ * *
* The Mongoose ObjectId [ SchemaType ] ( / d o c s / s c h e m a t y p e s . h t m l ) . U s e d f o r
* declaring paths in your schema that should be
* [ MongoDB ObjectIds ] ( https : //docs.mongodb.com/manual/reference/method/ObjectId/).
* Do not use this to create a new ObjectId instance , use ` mongoose.Types.ObjectId `
* instead .
*
* # # # # Example :
*
* const childSchema = new Schema ( { parentId : mongoose . ObjectId } ) ;
*
* @ property ObjectId
* @ api public
* /
Mongoose . prototype . ObjectId = SchemaTypes . ObjectId ;
/ * *
* The Mongoose Decimal128 [ SchemaType ] ( / d o c s / s c h e m a t y p e s . h t m l ) . U s e d f o r
* declaring paths in your schema that should be
* [ 128 - bit decimal floating points ] ( http : //thecodebarbarian.com/a-nodejs-perspective-on-mongodb-34-decimal.html).
* Do not use this to create a new Decimal128 instance , use ` mongoose.Types.Decimal128 `
* instead .
*
* # # # # Example :
*
* const vehicleSchema = new Schema ( { fuelLevel : mongoose . Decimal128 } ) ;
*
* @ property Decimal128
* @ api public
* /
Mongoose . prototype . Decimal128 = SchemaTypes . Decimal128 ;
/ * *
* The Mongoose Mixed [ SchemaType ] ( / d o c s / s c h e m a t y p e s . h t m l ) . U s e d f o r
* declaring paths in your schema that Mongoose ' s change tracking , casting ,
* and validation should ignore .
*
* # # # # Example :
*
* const schema = new Schema ( { arbitrary : mongoose . Mixed } ) ;
*
* @ property Mixed
* @ api public
* /
Mongoose . prototype . Mixed = SchemaTypes . Mixed ;
/ * *
* The Mongoose Number [ SchemaType ] ( / d o c s / s c h e m a t y p e s . h t m l ) . U s e d f o r
* declaring paths in your schema that Mongoose should cast to numbers .
*
* # # # # Example :
*
* const schema = new Schema ( { num : mongoose . Number } ) ;
* // Equivalent to:
* const schema = new Schema ( { num : 'number' } ) ;
*
* @ property Number
* @ api public
* /
Mongoose . prototype . Number = SchemaTypes . Number ;
/ * *
* The [ MongooseError ] ( # error _MongooseError ) constructor .
*
* @ method Error
* @ api public
* /
Mongoose . prototype . Error = require ( './error' ) ;
/ * *
* Mongoose uses this function to get the current time when setting
* [ timestamps ] ( / d o c s / g u i d e . h t m l # t i m e s t a m p s ) . Y o u m a y s t u b o u t t h i s f u n c t i o n
* using a tool like [ Sinon ] ( https : //www.npmjs.com/package/sinon) for testing.
*
* @ method now
* @ returns Date the current time
* @ api public
* /
Mongoose . prototype . now = function now ( ) { return new Date ( ) ; } ;
/ * *
* The Mongoose CastError constructor
*
* @ method CastError
* @ param { String } type The name of the type
* @ param { Any } value The value that failed to cast
* @ param { String } path The path ` a.b.c ` in the doc where this cast error occurred
* @ param { Error } [ reason ] The original error that was thrown
* @ api public
* /
Mongoose . prototype . CastError = require ( './error/cast' ) ;
/ * *
* The [ node - mongodb - native ] ( https : //github.com/mongodb/node-mongodb-native) driver Mongoose uses.
*
* @ property mongo
* @ api public
* /
Mongoose . prototype . mongo = require ( 'mongodb' ) ;
/ * *
* The [ mquery ] ( https : //github.com/aheckmann/mquery) query builder Mongoose uses.
*
* @ property mquery
* @ api public
* /
Mongoose . prototype . mquery = require ( 'mquery' ) ;
/ * !
* The exports object is an instance of Mongoose .
*
* @ api public
* /
const mongoose = module . exports = exports = new Mongoose ( {
[ defaultMongooseSymbol ] : true
} ) ;