模式


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 })

选项

嵌套模式的选项

  • 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 个属性的对象:schemamodel

此属性通常只对插件作者和高级用户有用。您根本不需要与该属性交互即可使用 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 特定的语法糖,使用 msexpires 选项转换为秒,用于上面链接中的 expireAfterSeconds

    • [options.language_override=null] «String» 告诉 mongodb 使用指定的字段而不是 language 解析文本索引。

为此模式定义索引(最可能是复合索引)。

示例

schema.index({ first: 1, last: -1 })

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» 索引选项,包括 namedefinition

  • 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