模式
Schema()
Schema.Types
Schema.indexTypes
Schema.prototype.add()
Schema.prototype.alias()
Schema.prototype.childSchemas
Schema.prototype.clearIndexes()
Schema.prototype.clone()
Schema.prototype.discriminator()
Schema.prototype.eachPath()
Schema.prototype.get()
Schema.prototype.index()
Schema.prototype.indexes()
Schema.prototype.loadClass()
Schema.prototype.method()
Schema.prototype.obj
Schema.prototype.omit()
Schema.prototype.path()
Schema.prototype.pathType()
Schema.prototype.paths
Schema.prototype.pick()
Schema.prototype.plugin()
Schema.prototype.post()
Schema.prototype.pre()
Schema.prototype.queue()
Schema.prototype.remove()
Schema.prototype.removeIndex()
Schema.prototype.removeVirtual()
Schema.prototype.requiredPaths()
Schema.prototype.searchIndex()
Schema.prototype.set()
Schema.prototype.static()
Schema.prototype.virtual()
Schema.prototype.virtualpath()
Schema.prototype.virtuals
Schema.reserved
Schema()
参数
[definition]
«Object|Schema|Array» 可以是以下之一:描述模式路径的对象,或要复制的模式,或对象和模式的数组[options]
«Object»
继承
模式构造函数。
示例
const child = new Schema({ name: String });
const schema = new Schema({ name: String, age: Number, children: [child] });
const Tree = mongoose.model('Tree', schema);
// setting schema options
new Schema({ name: String }, { id: false, autoIndex: false })
选项
- autoIndex: bool - 默认值为 null(这意味着使用连接的 autoIndex 选项)
- autoCreate: bool - 默认值为 null(这意味着使用连接的 autoCreate 选项)
- bufferCommands: bool - 默认值为 true
- bufferTimeoutMS: number - 默认值为 10000(10 秒)。如果启用了
bufferCommands
,Mongoose 将等待连接重新建立的时间,然后才会出错。 - capped: bool | number | object - 默认值为 false
- collection: string - 无默认值
- discriminatorKey: string - 默认值为
__t
- id: bool - 默认值为 true
- _id: bool - 默认值为 true
- minimize: bool - 控制 document#toObject 手动调用时的行为 - 默认值为 true
- read: string
- readConcern: object - 默认值为 null,用于设置所有查询的默认 读取关注度。
- writeConcern: object - 默认值为 null,用于覆盖 MongoDB 服务器的默认写入关注度设置
- shardKey: object - 默认值为
null
- strict: bool - 默认值为 true
- strictQuery: bool - 默认值为 false
- toJSON - object - 无默认值
- toObject - object - 无默认值
- typeKey - string - 默认值为 'type'
- validateBeforeSave - bool - 默认值为
true
- validateModifiedOnly - bool - 默认值为
false
- versionKey: string or object - 默认值为 "__v"
- optimisticConcurrency: bool - 默认值为 false。设置为 true 以启用 乐观并发。
- collation: object - 默认值为 null(这意味着不使用任何排序规则)
- timeseries: object - 默认值为 null(这意味着此模式的集合不会是时间序列集合)
- selectPopulatedPaths: boolean - 默认值为
true
- skipVersioning: object - 要从版本控制中排除的路径
- timestamps: object or boolean - 默认值为
false
。如果为 true,Mongoose 会在您的模式中添加createdAt
和updatedAt
属性,并为您管理这些属性。 - pluginTags: 字符串数组 - 默认值为
undefined
。如果设置并使用tags
选项调用插件,则该插件将仅应用于具有匹配标签的模式。 - virtuals: object - 要定义的虚拟属性,是
.virtual
的别名 - [collectionOptions]: 将选项传递给
createCollection()
的对象,当调用Model.createCollection()
或将autoCreate
设置为 true 时。
嵌套模式的选项
excludeIndexes
: bool - 默认值为false
。如果为true
,则跳过在此模式的路径上构建索引。
注意
嵌套模式时(上面示例中的 children
),请始终先声明子模式,然后将其传递给其父模式。
Schema.Types
类型
- «property»
各种内置 Mongoose 模式类型。
示例
const mongoose = require('mongoose');
const ObjectId = mongoose.Schema.Types.ObjectId;
类型
使用此暴露的 Mixed
模式类型访问方式,我们可以在模式中使用它们。
const Mixed = mongoose.Schema.Types.Mixed;
new mongoose.Schema({ _user: Mixed })
Schema.indexTypes
类型
- «property»
允许的索引类型
Schema.prototype.add()
参数
obj
«Object|Schema» 包含要添加的路径的普通对象,或另一个模式[prefix]
«String» 要添加到新添加路径的路径前缀
返回值
- «Schema» 模式实例
将键路径/模式类型对添加到此模式。
示例
const ToySchema = new Schema();
ToySchema.add({ name: 'string', color: 'string', price: 'number' });
const TurboManSchema = new Schema();
// You can also `add()` another schema and copy over all paths, virtuals,
// getters, setters, indexes, methods, and statics.
TurboManSchema.add(ToySchema).add({ year: Number });
Schema.prototype.alias()
参数
path
«String» 要设置别名的实际路径alias
«String|Array[String]» 用作path
别名的路径
返回值
- «Schema» 模式实例
为 path
添加别名。这意味着获取或设置 alias
等效于获取或设置 path
。
示例
const toySchema = new Schema({ n: String });
// Make 'name' an alias for 'n'
toySchema.alias('n', 'name');
const Toy = mongoose.model('Toy', toySchema);
const turboMan = new Toy({ n: 'Turbo Man' });
turboMan.name; // 'Turbo Man'
turboMan.n; // 'Turbo Man'
turboMan.name = 'Turbo Man Action Figure';
turboMan.n; // 'Turbo Man Action Figure'
await turboMan.save(); // Saves { _id: ..., n: 'Turbo Man Action Figure' }
Schema.prototype.childSchemas
类型
- «property»
子模式数组(来自文档数组和单个嵌套子文档)及其相应的已编译模型。数组的每个元素都是一个包含 2 个属性的对象:schema
和 model
。
此属性通常只对插件作者和高级用户有用。您根本不需要与该属性交互即可使用 mongoose。
Schema.prototype.clearIndexes()
返回值
- «Schema» 模式实例
从该模式中删除所有索引。
clearIndexes 仅从您的模式对象中删除索引。不会影响 MongoDB 中的索引。
示例
const ToySchema = new Schema({ name: String, color: String, price: Number });
ToySchema.index({ name: 1 });
ToySchema.index({ color: 1 });
// Remove all indexes on this schema
ToySchema.clearIndexes();
ToySchema.indexes(); // []
Schema.prototype.clone()
返回值
- «Schema» 克隆的模式
返回模式的深层副本
示例
const schema = new Schema({ name: String });
const clone = schema.clone();
clone === schema; // false
clone.path('name'); // SchemaString { ... }
Schema.prototype.discriminator()
参数
name
«String» 鉴别器的名称schema
«Schema» 鉴别的模式[options]
«Object» 鉴别器选项[options.value]
«String» 存储在discriminatorKey
属性中的字符串。如果未指定,Mongoose 会使用name
参数。[options.clone=true]
«Boolean» 默认情况下,discriminator()
会克隆给定的schema
。设置为false
以跳过克隆。[options.overwriteModels=false]
«Boolean» 默认情况下,Mongoose 不允许您定义与其他鉴别器同名的鉴别器。设置为允许覆盖同名的鉴别器。[options.mergeHooks=true]
«Boolean» 默认情况下,Mongoose 会将基本模式的钩子与鉴别器模式的钩子合并。将此选项设置为false
以使 Mongoose 使用鉴别器模式的钩子。[options.mergePlugins=true]
«Boolean» 默认情况下,Mongoose 会将基本模式的插件与鉴别器模式的插件合并。将此选项设置为false
以使 Mongoose 使用鉴别器模式的插件。
返回值
- «Schema» 模式实例
通过对现有模式应用鉴别器来继承模式。
示例
const eventSchema = new mongoose.Schema({ timestamp: Date }, { discriminatorKey: 'kind' });
const clickedEventSchema = new mongoose.Schema({ element: String }, { discriminatorKey: 'kind' });
const ClickedModel = eventSchema.discriminator('clicked', clickedEventSchema);
const Event = mongoose.model('Event', eventSchema);
Event.discriminators['clicked']; // Model { clicked }
const doc = await Event.create({ kind: 'clicked', element: '#hero' });
doc.element; // '#hero'
doc instanceof ClickedModel; // true
Schema.prototype.eachPath()
参数
fn
«Function» 回调函数
返回值
- «Schema» this
类似于 Array#forEach 迭代模式路径。
回调将传递路径名和模式类型实例。
示例
const userSchema = new Schema({ name: String, registeredAt: Date });
userSchema.eachPath((pathname, schematype) => {
// Prints twice:
// name SchemaString { ... }
// registeredAt SchemaDate { ... }
console.log(pathname, schematype);
});
Schema.prototype.get()
参数
key
«String» 要获取其当前值的选项的名称
返回值
- «Any» 选项的值
获取模式选项。
示例
schema.get('strict'); // true
schema.set('strict', false);
schema.get('strict'); // false
Schema.prototype.index()
参数
fields
«Object» 要索引的字段,以及排序,可用值:1 | -1 | '2d' | '2dsphere' | 'geoHaystack' | 'hashed' | 'text'
[options]
«Object» 要传递给 MongoDB 驱动程序的createIndex()
函数 的选项[options.expires=null]
«String|number» Mongoose 特定的语法糖,使用 ms 将expires
选项转换为秒,用于上面链接中的expireAfterSeconds
。[options.language_override=null]
«String» 告诉 mongodb 使用指定的字段而不是language
解析文本索引。
Schema.prototype.indexes()
返回值
- «Array» 模式中定义的索引列表
返回该模式声明的索引列表,通过 schema.index()
或通过路径选项中的 index: true
。索引表示为数组 [spec, options]
。
示例
const userSchema = new Schema({
email: { type: String, required: true, unique: true },
registeredAt: { type: Date, index: true }
});
// [ [ { email: 1 }, { unique: true, background: true } ],
// [ { registeredAt: 1 }, { background: true } ] ]
userSchema.indexes();
插件 可以使用此函数的返回值修改模式的索引。例如,以下插件默认情况下会将每个索引设为唯一。
function myPlugin(schema) {
for (const index of schema.indexes()) {
if (index[1].unique === undefined) {
index[1].unique = true;
}
}
}
Schema.prototype.loadClass()
参数
model
«Function» 要加载的类[virtualsOnly]
«Boolean» 如果为真,则仅从类中提取虚拟属性,而不是方法或静态属性
将 ES6 类加载到模式中。映射 setter + getter、静态方法 和 实例方法 到模式 虚拟属性、静态属性 和 方法。
示例
const md5 = require('md5');
const userSchema = new Schema({ email: String });
class UserClass {
// `gravatarImage` becomes a virtual
get gravatarImage() {
const hash = md5(this.email.toLowerCase());
return `https://www.gravatar.com/avatar/${hash}`;
}
// `getProfileUrl()` becomes a document method
getProfileUrl() {
return `https://mysite.com/${this.email}`;
}
// `findByEmail()` becomes a static
static findByEmail(email) {
return this.findOne({ email });
}
}
// `schema` will now have a `gravatarImage` virtual, a `getProfileUrl()` method,
// and a `findByEmail()` static
userSchema.loadClass(UserClass);
Schema.prototype.method()
参数
name
«String|Object» 单个函数的方法名称,或“字符串-函数”对的 Object。[fn]
«Function» 单个函数定义中的函数。
向从使用此模式编译的模型构造的文档添加实例方法。
示例
const schema = kittySchema = new Schema(..);
schema.method('meow', function () {
console.log('meeeeeoooooooooooow');
})
const Kitty = mongoose.model('Kitty', schema);
const fizz = new Kitty;
fizz.meow(); // meeeeeooooooooooooow
如果将名称/fn 对的哈希作为唯一参数传递,则每个名称/fn 对都将作为方法添加。
schema.method({
purr: function () {}
, scratch: function () {}
});
// later
const fizz = new Kitty;
fizz.purr();
fizz.scratch();
注意:Schema.method()
将实例方法添加到 Schema.methods
对象。您也可以直接将实例方法添加到 Schema.methods
对象,如 指南 中所示
Schema.prototype.obj
类型
- «property»
传递给模式构造函数的原始对象
示例
const schema = new Schema({ a: String }).add({ b: String });
schema.obj; // { a: String }
Schema.prototype.omit()
参数
paths
«Array[String]» 要从新模式中省略的路径列表[options]
«Object» 要传递给新模式构造函数的选项(与new Schema(.., Options)
相同)。如果未设置,则默认为this.options
。
返回值
- «Schema»
返回一个新的模式,该模式具有原始模式中的 paths
,但省略了省略的路径。
此方法类似于 Mongoose 模式 Lodash 的 omit()
函数。
示例
const schema = Schema({ name: String, age: Number });
// Creates a new schema omitting the `age` path
const newSchema = schema.omit(['age']);
newSchema.path('name'); // SchemaString { ... }
newSchema.path('age'); // undefined
Schema.prototype.path()
参数
path
«String» 要获取/设置的路径名称[obj]
«Object» 要将路径设置为的类型。如果提供,则将设置路径,否则将获取路径
获取/设置模式路径。
设置路径(如果元数为 2),获取路径(如果元数为 1)
示例
schema.path('name') // returns a SchemaType
schema.path('name', Number) // changes the schemaType of `name` to Number
Schema.prototype.pathType()
参数
path
«String»
返回值
- «String»
返回此模式的 path
的 pathType。
给定一个路径,返回它是否是真实、虚拟、嵌套或临时/未定义的路径。
示例
const s = new Schema({ name: String, nested: { foo: String } });
s.virtual('foo').get(() => 42);
s.pathType('name'); // "real"
s.pathType('nested'); // "nested"
s.pathType('foo'); // "virtual"
s.pathType('fail'); // "adhocOrUndefined"
Schema.prototype.paths
类型
- «property»
在此模式上定义的路径。键是此模式中的顶层路径,值是 SchemaType 类的实例。
示例
const schema = new Schema({ name: String }, { _id: false });
schema.paths; // { name: SchemaString { ... } }
schema.add({ age: Number });
schema.paths; // { name: SchemaString { ... }, age: SchemaNumber { ... } }
Schema.prototype.pick()
参数
paths
«Array[String]» 要为新模式选择的路径列表[options]
«Object» 要传递给新模式构造函数的选项(与new Schema(.., Options)
相同)。如果未设置,则默认为this.options
。
返回值
- «Schema»
返回一个新的模式,该模式具有从该模式中选择的 paths
。
此方法类似于 Mongoose 模式 Lodash 的 pick()
函数。
示例
const schema = Schema({ name: String, age: Number });
// Creates a new schema with the same `name` path as `schema`,
// but no `age` path.
const newSchema = schema.pick(['name']);
newSchema.path('name'); // SchemaString { ... }
newSchema.path('age'); // undefined
Schema.prototype.plugin()
参数
plugin
«Function» 插件的回调[opts]
«Object» 要传递给插件的选项[opts.deduplicate=false]
«Boolean» 如果为 true,则忽略重复插件(使用===
的相同fn
参数)
参见
为该模式注册一个插件。
示例
const s = new Schema({ name: String });
s.plugin(schema => console.log(schema.path('name').path));
mongoose.model('Test', s); // Prints 'name'
或者使用选项
const s = new Schema({ name: String });
s.plugin((schema, opts) => console.log(opts.text, schema.path('name').path), { text: "Schema Path Name:" });
mongoose.model('Test', s); // Prints 'Schema Path Name: name'
Schema.prototype.post()
参数
methodName
«String|RegExp|Array[String]» 方法名称或匹配方法名称的正则表达式[options]
«Object»[options.document]
«Boolean» 如果name
是文档和查询中间件的钩子,则设置为true
才能在文档中间件上运行。[options.query]
«Boolean» 如果name
是文档和查询中间件的钩子,则设置为true
才能在查询中间件上运行。fn
«Function» 回调
参见
为文档定义一个后置钩子
const schema = new Schema(..);
schema.post('save', function (doc) {
console.log('this fired after a document was saved');
});
schema.post('find', function(docs) {
console.log('this fired after you ran a find query');
});
schema.post(/Many$/, function(res) {
console.log('this fired after you ran `updateMany()` or `deleteMany()`');
});
const Model = mongoose.model('Model', schema);
const m = new Model(..);
m.save(function(err) {
console.log('this fires after the `post` hook');
});
m.find(function(err, docs) {
console.log('this fires after the post find hook');
});
Schema.prototype.pre()
参数
methodName
«String|RegExp|Array[String]» 方法名称或匹配方法名称的正则表达式[options]
«Object»[options.document]
«Boolean» 如果name
是文档和查询中间件的钩子,则设置为true
才能在文档中间件上运行。例如,将options.document
设置为true
将此钩子应用于Document#deleteOne()
而不是Query#deleteOne()
。[options.query]
«Boolean» 如果name
是文档和查询中间件的钩子,则设置为true
才能在查询中间件上运行。callback
«Function»
为模型定义一个预置钩子。
示例
const toySchema = new Schema({ name: String, created: Date });
toySchema.pre('save', function(next) {
if (!this.created) this.created = new Date;
next();
});
toySchema.pre('validate', function(next) {
if (this.name !== 'Woody') this.name = 'Woody';
next();
});
// Equivalent to calling `pre()` on `find`, `findOne`, `findOneAndUpdate`.
toySchema.pre(/^find/, function(next) {
console.log(this.getFilter());
});
// Equivalent to calling `pre()` on `updateOne`, `findOneAndUpdate`.
toySchema.pre(['updateOne', 'findOneAndUpdate'], function(next) {
console.log(this.getFilter());
});
toySchema.pre('deleteOne', function() {
// Runs when you call `Toy.deleteOne()`
});
toySchema.pre('deleteOne', { document: true }, function() {
// Runs when you call `doc.deleteOne()`
});
Schema.prototype.queue()
参数
name
«String» 稍后调用的文档方法的名称args
«Array» 要传递给方法的参数
将方法调用添加到队列。
示例
schema.methods.print = function() { console.log(this); };
schema.queue('print', []); // Print the doc every one is instantiated
const Model = mongoose.model('Test', schema);
new Model({ name: 'test' }); // Prints '{"_id": ..., "name": "test" }'
Schema.prototype.remove()
参数
path
«String|Array» 要删除的路径
返回值
- «Schema» 模式实例
删除给定的 path
(或 [paths
])。
示例
const schema = new Schema({ name: String, age: Number });
schema.remove('name');
schema.path('name'); // Undefined
schema.path('age'); // SchemaNumber { ... }
或作为数组
schema.remove(['name', 'age']);
schema.path('name'); // Undefined
schema.path('age'); // Undefined
Schema.prototype.removeIndex()
参数
index
«Object|string» 名称或索引规范
返回值
- «Schema» 模式实例
按名称或索引规范删除索引。
removeIndex 仅从模式对象中删除索引。不会影响 MongoDB 中的索引。
示例
const ToySchema = new Schema({ name: String, color: String, price: Number });
// Add a new index on { name, color }
ToySchema.index({ name: 1, color: 1 });
// Remove index on { name, color }
// Keep in mind that order matters! `removeIndex({ color: 1, name: 1 })` won't remove the index
ToySchema.removeIndex({ name: 1, color: 1 });
// Add an index with a custom name
ToySchema.index({ color: 1 }, { name: 'my custom index name' });
// Remove index by name
ToySchema.removeIndex('my custom index name');
Schema.prototype.removeVirtual()
参数
path
«String|Array» 要删除的虚拟路径。
从模式中删除给定的虚拟或虚拟。
Schema.prototype.requiredPaths()
参数
invalidate
«Boolean» 刷新缓存
返回值
- «Array»
返回一个由该模式要求的路径字符串数组。
示例
const s = new Schema({
name: { type: String, required: true },
age: { type: String, required: true },
notes: String
});
s.requiredPaths(); // [ 'age', 'name' ]
Schema.prototype.searchIndex()
参数
description
«Object» 索引选项,包括name
和definition
description.name
«String»description.definition
«Object»
返回值
- «Schema» 模式实例
添加一个 Atlas 搜索索引,Mongoose 将使用 Model.createSearchIndex()
创建。此函数仅在连接到 MongoDB Atlas 时有效。
示例
const ToySchema = new Schema({ name: String, color: String, price: Number });
ToySchema.searchIndex({ name: 'test', definition: { mappings: { dynamic: true } } });
Schema.prototype.set()
参数
key
«String» 要将值设置为的选项名称[value]
«Object» 要将选项设置为的值,如果未传递,则选项将重置为默认值[tags]
«Array<string>» 要添加到读取首选项的标签,如果 key === 'read'
参见
设置模式选项。
示例
schema.set('strict'); // 'true' by default
schema.set('strict', false); // Sets 'strict' to false
schema.set('strict'); // 'false'
Schema.prototype.static()
参数
name
«String|Object» 单个函数的方法名称,或“字符串-函数”对的 Object。[fn]
«Function» 单个函数定义中的函数。
参见
向从该模式编译的模型添加静态“类”方法。
示例
const schema = new Schema(..);
// Equivalent to `schema.statics.findByName = function(name) {}`;
schema.static('findByName', function(name) {
return this.find({ name: name });
});
const Drink = mongoose.model('Drink', schema);
await Drink.findByName('LaCroix');
如果将名称/fn 对的哈希作为唯一参数传递,则每个名称/fn 对都将作为方法添加。
schema.static({
findByName: function () {..}
, findByCost: function () {..}
});
const Drink = mongoose.model('Drink', schema);
await Drink.findByName('LaCroix');
await Drink.findByCost(3);
如果将名称/fn 对的哈希作为唯一参数传递,则每个名称/fn 对将作为 statics 添加。
Schema.prototype.virtual()
参数
name
«String» 虚拟的名称[options]
«Object»[options.ref]
«String|Model» 模型名称或模型实例。将此标记为 填充虚拟。[options.localField]
«String|Function» 填充虚拟所需。有关更多信息,请参阅 填充虚拟文档。[options.foreignField]
«String|Function» 填充虚拟所需。有关更多信息,请参阅 填充虚拟文档。[options.justOne=false]
«Boolean|Function» 仅适用于填充虚拟。如果 truthy,将是一个单独的文档或null
。否则,填充虚拟将是一个数组。[options.count=false]
«Boolean» 仅适用于填充虚拟。如果 truthy,则此填充虚拟将包含文档的数量,而不是populate()
时的文档本身。[options.get=null]
«Function|null» 为此虚拟添加一个 getter 以转换填充的文档。[options.match=null]
«Object|Function» 对填充应用默认的match
选项,在填充查询中添加一个额外的过滤器。
返回值
- «VirtualType»
使用给定名称创建一个虚拟类型。
Schema.prototype.virtualpath()
参数
name
«String» 要获取的虚拟的名称
返回值
- «VirtualType,null»
返回具有给定 name
的虚拟类型。
Schema.prototype.virtuals
类型
- «property»
包含在此模式上定义的所有虚拟的对象。对象的键是虚拟路径,值是 VirtualType
的实例。
此属性通常只对插件作者和高级用户有用。您根本不需要与该属性交互即可使用 mongoose。
示例
const schema = new Schema({});
schema.virtual('answer').get(() => 42);
console.log(schema.virtuals); // { answer: VirtualType { path: 'answer', ... } }
console.log(schema.virtuals['answer'].getters[0].call()); // 42
Schema.reserved
类型
- «property»
保留的文档键。
此对象中的键是在模式声明中发出警告的名称,因为它们有可能破坏 Mongoose/ Mongoose 插件的功能。如果使用 new Schema()
创建一个具有这些属性名称之一的模式,Mongoose 将记录一个警告。
- _posts
- _pres
- collection
- emit
- errors
- get
- init
- isModified
- isNew
- listeners
- modelName
- on
- once
- populated
- prototype
- remove
- removeListener
- save
- schema
- toObject
- validate
注意: 允许将这些术语用作方法名称,但要自担风险,因为它们可能是您正在覆盖的现有 mongoose 文档方法。
const schema = new Schema(..);
schema.methods.init = function () {} // potentially breaking