You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					101 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					101 lines
				
				2.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Module dependencies.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const NodeJSDocument = require('./document');
							 | 
						||
| 
								 | 
							
								const EventEmitter = require('events').EventEmitter;
							 | 
						||
| 
								 | 
							
								const MongooseError = require('./error/index');
							 | 
						||
| 
								 | 
							
								const Schema = require('./schema');
							 | 
						||
| 
								 | 
							
								const ObjectId = require('./types/objectid');
							 | 
						||
| 
								 | 
							
								const ValidationError = MongooseError.ValidationError;
							 | 
						||
| 
								 | 
							
								const applyHooks = require('./helpers/model/applyHooks');
							 | 
						||
| 
								 | 
							
								const isObject = require('./helpers/isObject');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Document constructor.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {Object} obj the values to set
							 | 
						||
| 
								 | 
							
								 * @param {Object} [fields] optional object containing the fields which were selected in the query returning this document and any populated paths data
							 | 
						||
| 
								 | 
							
								 * @param {Boolean} [skipId] bool, should we auto create an ObjectId _id
							 | 
						||
| 
								 | 
							
								 * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter
							 | 
						||
| 
								 | 
							
								 * @event `init`: Emitted on a document after it has was retrieved from the db and fully hydrated by Mongoose.
							 | 
						||
| 
								 | 
							
								 * @event `save`: Emitted when the document is successfully saved
							 | 
						||
| 
								 | 
							
								 * @api private
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Document(obj, schema, fields, skipId, skipInit) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof Document)) {
							 | 
						||
| 
								 | 
							
								    return new Document(obj, schema, fields, skipId, skipInit);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (isObject(schema) && !schema.instanceOfSchema) {
							 | 
						||
| 
								 | 
							
								    schema = new Schema(schema);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // When creating EmbeddedDocument, it already has the schema and he doesn't need the _id
							 | 
						||
| 
								 | 
							
								  schema = this.schema || schema;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Generate ObjectId if it is missing, but it requires a scheme
							 | 
						||
| 
								 | 
							
								  if (!this.schema && schema.options._id) {
							 | 
						||
| 
								 | 
							
								    obj = obj || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (obj._id === undefined) {
							 | 
						||
| 
								 | 
							
								      obj._id = new ObjectId();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!schema) {
							 | 
						||
| 
								 | 
							
								    throw new MongooseError.MissingSchemaError();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.$__setSchema(schema);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  NodeJSDocument.call(this, obj, fields, skipId, skipInit);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  applyHooks(this, schema, { decorateDoc: true });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // apply methods
							 | 
						||
| 
								 | 
							
								  for (const m in schema.methods) {
							 | 
						||
| 
								 | 
							
								    this[m] = schema.methods[m];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  // apply statics
							 | 
						||
| 
								 | 
							
								  for (const s in schema.statics) {
							 | 
						||
| 
								 | 
							
								    this[s] = schema.statics[s];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Inherit from the NodeJS document
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Document.prototype = Object.create(NodeJSDocument.prototype);
							 | 
						||
| 
								 | 
							
								Document.prototype.constructor = Document;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * ignore
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Document.events = new EventEmitter();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Browser doc exposes the event emitter API
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Document.$emitter = new EventEmitter();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								['on', 'once', 'emit', 'listeners', 'removeListener', 'setMaxListeners',
							 | 
						||
| 
								 | 
							
								  'removeAllListeners', 'addListener'].forEach(function(emitterFn) {
							 | 
						||
| 
								 | 
							
								  Document[emitterFn] = function() {
							 | 
						||
| 
								 | 
							
								    return Document.$emitter[emitterFn].apply(Document.$emitter, arguments);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Module exports.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Document.ValidationError = ValidationError;
							 | 
						||
| 
								 | 
							
								module.exports = exports = Document;
							 |