模型
Model()Model.$where()Model.aggregate()Model.applyDefaults()Model.applyVirtuals()Model.bulkSave()Model.bulkWrite()Model.castObject()Model.cleanIndexes()Model.countDocuments()Model.create()Model.createCollection()Model.createIndexes()Model.createSearchIndex()Model.dbModel.deleteMany()Model.deleteOne()Model.diffIndexes()Model.discriminator()Model.distinct()Model.dropSearchIndex()Model.ensureIndexes()Model.estimatedDocumentCount()Model.eventsModel.exists()Model.find()Model.findById()Model.findByIdAndDelete()Model.findByIdAndUpdate()Model.findOne()Model.findOneAndDelete()Model.findOneAndReplace()Model.findOneAndUpdate()Model.hydrate()Model.init()Model.insertMany()Model.inspect()Model.listIndexes()Model.listSearchIndexes()Model.populate()Model.prototype.$model()Model.prototype.$whereModel.prototype.baseModel.prototype.baseModelNameModel.prototype.collectionModel.prototype.collectionModel.prototype.dbModel.prototype.deleteOne()Model.prototype.discriminatorsModel.prototype.increment()Model.prototype.model()Model.prototype.modelNameModel.prototype.save()Model.recompileSchema()Model.replaceOne()Model.schemaModel.startSession()Model.syncIndexes()Model.translateAliases()Model.updateMany()Model.updateOne()Model.updateSearchIndex()Model.validate()Model.watch()Model.where()
Model()
参数
doc«Object» 用于初始设置的值[fields]«Object» 可选对象,包含查询中选择的字段,这些字段返回了此文档。您 **不需要** 设置此参数来确保 Mongoose 处理您的 查询投影。[skipId=false]«Boolean» 可选布尔值。如果为真,mongoose 不会将_id字段添加到文档中。
继承
模型是一个类,是您与 MongoDB 交互的主要工具。模型的实例称为 文档。
在 Mongoose 中,术语“模型”指的是 mongoose.Model 类的子类。您不应该直接使用 mongoose.Model 类。 mongoose.model() 和 connection.model() 函数创建 mongoose.Model 的子类,如下所示。
示例
// `UserModel` is a "Model", a subclass of `mongoose.Model`.
const UserModel = mongoose.model('User', new Schema({ name: String }));
// You can use a Model to create new documents using `new`:
const userDoc = new UserModel({ name: 'Foo' });
await userDoc.save();
// You also use a model to create queries:
const userFromDb = await UserModel.findOne({ name: 'Foo' }); Model.$where()
参数
argument«String|Function» 是一个 javascript 字符串或匿名函数
返回值
- «Query»
查看
创建一个 Query 并指定 $where 条件。
有时您需要使用 JavaScript 表达式查询 mongodb 中的内容。您可以通过 find({ $where: javascript }) 执行此操作,或者可以通过 Query 链或从您的 mongoose 模型中使用 mongoose 快捷方法 $where。
Blog.$where('this.username.indexOf("val") !== -1').exec(function (err, docs) {}); Model.aggregate()
参数
[pipeline]«Array» 聚合管道,作为对象数组[options]«Object» 聚合选项
返回值
- «Aggregate»
查看
在模型的集合上执行 聚合。
如果传递了 callback,则执行 aggregate 并返回 Promise。如果未传递回调,则返回 aggregate 本身。
此函数触发以下中间件。
aggregate()
示例
// Find the max balance of all accounts
const res = await Users.aggregate([
{ $group: { _id: null, maxBalance: { $max: '$balance' }}},
{ $project: { _id: 0, maxBalance: 1 }}
]);
console.log(res); // [ { maxBalance: 98000 } ]
// Or use the aggregation pipeline builder.
const res = await Users.aggregate().
group({ _id: null, maxBalance: { $max: '$balance' } }).
project('-id maxBalance').
exec();
console.log(res); // [ { maxBalance: 98 } ]注意
- Mongoose **不会** 将聚合管道转换为模型的模式,因为
$project和$group运算符允许在管道的任何阶段重新定义文档的“形状”,这可能会导致文档处于不兼容的格式。您可以使用 mongoose-cast-aggregation 插件 为聚合管道启用最小转换。 - 返回的文档是纯 javascript 对象,而不是 mongoose 文档(因为可以返回任何形状的文档)。
关于聚合的更多信息
Model.applyDefaults()
参数
obj«Object|Document» 要应用默认值的 对象或文档
将默认值应用于给定的文档或 POJO。
Model.applyVirtuals()
参数
obj«Object» 要应用虚拟值的 对象或文档[virtualsToApply]«Array<string>» 要应用的虚拟值的可选白名单
将此模型的虚拟值应用于给定的 POJO。虚拟值以 POJO 作为上下文 this 执行。
示例
const userSchema = new Schema({ name: String });
userSchema.virtual('upper').get(function() { return this.name.toUpperCase(); });
const User = mongoose.model('User', userSchema);
const obj = { name: 'John' };
User.applyVirtuals(obj);
obj.name; // 'John'
obj.upper; // 'JOHN', Mongoose applied the return value of the virtual to the given object Model.bulkSave()
参数
documents«Array<Document>»[options]«Object» 传递给底层bulkWrite()的选项[options.timestamps]«Boolean» 默认值为null,当设置为 false 时,mongoose 不会将时间戳添加到文档或更新时间戳。[options.session=null]«ClientSession» 与此批量写入关联的会话。查看 事务文档。[options.wtimeout=null]«number» 写入关注超时。[options.j=true]«Boolean» 如果为 false,则禁用 日志确认
返回值
- «BulkWriteResult»
bulkWrite()的返回值
获取文档数组,获取更改,并根据文档是新的,还是有更改,在数据库中插入或更新文档。
bulkSave 在后台使用 bulkWrite,因此它在处理大量文档(10K+)时非常有用
bulkSave() 在以下情况下会抛出错误
- 提供的文档之一验证失败。在这种情况下,
bulkSave()不会发送bulkWrite(),而是抛出第一个验证错误。 bulkWrite()失败(例如,由于无法连接到 MongoDB 或由于重复键错误)bulkWrite()未插入或更新 **任何** 文档。在这种情况下,bulkSave()将抛出 DocumentNotFound 错误。
请注意,如果仅成功执行了一些 save() 调用,bulkSave() **不会** 抛出错误。
Model.bulkWrite()
参数
ops«Array»[ops.insertOne.document]«Object» 要插入的文档[ops.insertOne.timestamps=true]«Object» 如果为 false,则不要对操作应用 时间戳[ops.updateOne.filter]«Object» 更新与该过滤器匹配的第一个文档[ops.updateOne.update]«Object» 包含 更新运算符 的对象[ops.updateOne.upsert=false]«Boolean» 如果为 true,则在没有匹配项时插入文档[ops.updateOne.timestamps=true]«Boolean» 如果为 false,则不要对操作应用 时间戳[ops.updateOne.collation]«Object» 要使用的 MongoDB 校对[ops.updateOne.arrayFilters]«Array» 在update中使用的 数组过滤器[ops.updateMany.filter]«Object» 更新与该过滤器匹配的所有文档[ops.updateMany.update]«Object» 包含 更新运算符 的对象[ops.updateMany.upsert=false]«Boolean» 如果为 true,则在没有文档与filter匹配时插入文档[ops.updateMany.timestamps=true]«Boolean» 如果为 false,则不要对操作应用 时间戳[ops.updateMany.collation]«Object» 要使用的 MongoDB 校对[ops.updateMany.arrayFilters]«Array» 在update中使用的 数组过滤器[ops.deleteOne.filter]«Object» 删除与该过滤器匹配的第一个文档[ops.deleteMany.filter]«Object» 删除与该过滤器匹配的所有文档[ops.replaceOne.filter]«Object» 替换与该过滤器匹配的第一个文档[ops.replaceOne.replacement]«Object» 替换文档[ops.replaceOne.upsert=false]«Boolean» 如果为 true,则在没有文档与filter匹配时插入文档[ops.replaceOne.timestamps=true]«Object» 如果为 false,则不要对操作应用 时间戳[options]«Object»[options.ordered=true]«Boolean» 如果为 true,则按顺序执行写入,并在第一个错误处停止。如果为 false,则并行执行写入,并继续执行,直到所有写入都已成功或出现错误。[options.timestamps=true]«Boolean» 如果为 false,则不要对任何操作应用 时间戳。可以在操作级别覆盖。[options.session=null]«ClientSession» 与此批量写入关联的会话。查看 事务文档。[options.wtimeout=null]«number» 写入关注超时。[options.j=true]«Boolean» 如果为 false,则禁用 日志确认[options.skipValidation=false]«Boolean» 设置为 true 以跳过批量写入操作的 Mongoose 模式验证。目前,Mongoose 默认情况下对insertOne和replaceOne操作运行验证。[options.bypassDocumentValidation=false]«Boolean» 如果为 true,则禁用 MongoDB 服务器端模式验证,用于此批量中的所有写入。[options.throwOnValidationError=false]«Boolean» 如果为 true 且ordered: false,则如果操作之一验证失败,但所有有效的操作都成功完成,则抛出错误。请注意,Mongoose 仍然会将所有有效的操作发送到 MongoDB 服务器。[options.strict=null]«Boolean|[object Object]» 覆盖模式上的strict选项。如果为 false,则允许过滤和写入此批量中所有写入的模式中未定义的字段。
返回值
- «Promise» 如果操作成功,则解析为
BulkWriteOpResult
将多个 insertOne、updateOne、updateMany、replaceOne、deleteOne 和/或 deleteMany 操作作为单个命令发送到 MongoDB 服务器。这比发送多个独立的操作更快(例如,如果您使用 create()),因为使用 bulkWrite() 只需与 MongoDB 进行一次往返。
Mongoose 将对您提供的操作执行转换。唯一的例外是 将 updateOne 或 updateMany 的 update 运算符设置为管道:Mongoose **不会** 转换更新管道。
此函数不会触发任何中间件,无论是save()还是update()。 如果您需要为每个文档触发save()中间件,请使用create()。
示例
Character.bulkWrite([
{
insertOne: {
document: {
name: 'Eddard Stark',
title: 'Warden of the North'
}
}
},
{
updateOne: {
filter: { name: 'Eddard Stark' },
// If you were using the MongoDB driver directly, you'd need to do
// `update: { $set: { title: ... } }` but mongoose adds $set for
// you.
update: { title: 'Hand of the King' }
}
},
{
deleteOne: {
filter: { name: 'Eddard Stark' }
}
}
]).then(res => {
// Prints "1 1 1"
console.log(res.insertedCount, res.modifiedCount, res.deletedCount);
});
// Mongoose does **not** cast update pipelines, so no casting for the `update` option below.
// Mongoose does still cast `filter`
await Character.bulkWrite([{
updateOne: {
filter: { name: 'Annika Hansen' },
update: [{ $set: { name: 7 } }] // Array means update pipeline, so Mongoose skips casting
}
}]);支持的操作包括:
insertOneupdateOneupdateManydeleteOnedeleteManyreplaceOne
Model.castObject()
参数
obj«Object» 要强制转换的对象或文档options«Object» 传递给 castObject 的选项options.ignoreCastErrors«Boolean» 如果设置为true,则不会抛出 ValidationError,并且只返回成功强制转换的值。
将给定的 POJO 强制转换为模型的模式
示例
const Test = mongoose.model('Test', Schema({ num: Number }));
const obj = Test.castObject({ num: '42' });
obj.num; // 42 as a number
Test.castObject({ num: 'not a number' }); // Throws a ValidationError Model.cleanIndexes()
参数
[callback]«Function» 可选回调
返回值
- «Promise,undefined,void» 如果指定了回调,则返回
undefined;如果未指定回调,则返回一个 Promise。
删除此模型模式中未定义的所有索引。 由syncIndexes()使用。
返回的 Promise 解析为一个数组,其中包含已删除索引的名称列表。
Model.countDocuments()
参数
filter«Object»
返回值
- «Query»
计算数据库集合中与filter匹配的文档数量。
示例
Adventure.countDocuments({ type: 'jungle' }, function (err, count) {
console.log('there are %d jungle adventures', count);
});如果您想计算大型集合中的所有文档,请改用estimatedDocumentCount()函数。如果您调用countDocuments({}),MongoDB 将始终执行完整集合扫描,而不是使用任何索引。
countDocuments()函数类似于count(),但有一些countDocuments()不支持的操作符。以下是count()支持但countDocuments()不支持的操作符,以及建议的替代方案
$where:$expr$near:$geoWithin以及$center$nearSphere:$geoWithin以及$centerSphere
Model.create()
参数
docs«Array|Object» 要插入的文档,作为扩展或数组[options]«Object» 传递给save()的选项。 要指定options,docs**必须** 是一个数组,而不是扩展。 有关可用选项,请参见Model.save。[options.ordered]«Boolean» 按顺序保存文档,而不是并行保存。[options.aggregateErrors]«Boolean» 聚合错误,而不是抛出第一个发生的错误。 默认值:false
返回值
- «Promise»
保存一个或多个文档到数据库的快捷方式。 MyModel.create(docs) 对docs中的每个文档执行new MyModel(doc).save()。
此函数触发以下中间件。
save()
示例
// Insert one new `Character` document
await Character.create({ name: 'Jean-Luc Picard' });
// Insert multiple new `Character` documents
await Character.create([{ name: 'Will Riker' }, { name: 'Geordi LaForge' }]);
// Create a new character within a transaction. Note that you **must**
// pass an array as the first parameter to `create()` if you want to
// specify options.
await Character.create([{ name: 'Jean-Luc Picard' }], { session }); Model.createCollection()
参数
[options]«Object» 请参见MongoDB 驱动程序文档
创建此模型的集合。 默认情况下,如果未指定任何索引,Mongoose 不会创建模型的集合,直到创建任何文档。 使用此方法显式创建集合。
注意 1:您可能需要在启动事务之前调用此方法。 请参见https://mongodb.ac.cn/docs/manual/core/transactions/#transactions-and-operations
注意 2:如果您的模式包含索引或唯一字段,则不必调用此方法。 在这种情况下,只需使用Model.init()。
示例
const userSchema = new Schema({ name: String })
const User = mongoose.model('User', userSchema);
User.createCollection().then(function(collection) {
console.log('Collection is created!');
}); Model.createIndexes()
参数
[options]«Object» 内部选项
返回值
- «Promise»
类似于ensureIndexes(),只是它使用createIndex 函数。
Model.createSearchIndex()
参数
description«Object» 索引选项,包括name和definitiondescription.name«String»description.definition«Object»
返回值
- «Promise»
创建Atlas 搜索索引。 此函数仅在连接到 MongoDB Atlas 时有效。
示例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.createSearchIndex({ name: 'test', definition: { mappings: { dynamic: true } } }); Model.db
类型
- «property»
模型使用的连接实例。
Model.deleteMany()
参数
conditions«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
从集合中删除与conditions匹配的所有文档。 它返回一个对象,该对象包含属性deletedCount,其中包含已删除文档的数量。 行为类似于remove(),但会删除与conditions匹配的所有文档,无论single 选项如何。
示例
await Character.deleteMany({ name: /Stark/, age: { $gte: 18 } }); // returns {deletedCount: x} where x is the number of documents deleted.注意
此函数触发deleteMany 查询钩子。 阅读中间件文档以了解详情。
Model.deleteOne()
参数
conditions«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
从集合中删除与conditions匹配的第一个文档。 它返回一个对象,该对象包含属性deletedCount,表示已删除的文档数量。 行为类似于remove(),但最多删除一个文档,无论single 选项如何。
示例
await Character.deleteOne({ name: 'Eddard Stark' }); // returns {deletedCount: 1}注意
此函数触发deleteOne 查询钩子。 阅读中间件文档以了解详情。
Model.diffIndexes()
参数
[options]«Object»
返回值
- «Promise<Object>» 包含将在 MongoDB 中删除的索引以及将在 MongoDB 中创建的索引,格式为
{ toDrop: string[], toCreate: string[] }。
对Model.syncIndexes()执行一个干运行,返回syncIndexes()将在运行syncIndexes()时删除和创建的索引。
示例
const { toDrop, toCreate } = await Model.diffIndexes();
toDrop; // Array of strings containing names of indexes that `syncIndexes()` will drop
toCreate; // Array of strings containing names of indexes that `syncIndexes()` will create Model.discriminator()
参数
name«String» 鉴别器模型名称schema«Schema» 鉴别器模型模式[options]«Object|String» 如果是字符串,则与options.value相同。[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 使用鉴别器模式的插件。
返回值
- «Model» 新创建的鉴别器模型
添加鉴别器类型。
示例
function BaseSchema() {
Schema.apply(this, arguments);
this.add({
name: String,
createdAt: Date
});
}
util.inherits(BaseSchema, Schema);
const PersonSchema = new BaseSchema();
const BossSchema = new BaseSchema({ department: String });
const Person = mongoose.model('Person', PersonSchema);
const Boss = Person.discriminator('Boss', BossSchema);
new Boss().__t; // "Boss". `__t` is the default `discriminatorKey`
const employeeSchema = new Schema({ boss: ObjectId });
const Employee = Person.discriminator('Employee', employeeSchema, 'staff');
new Employee().__t; // "staff" because of 3rd argument above Model.distinct()
参数
field«String»[conditions]«Object» 可选[options]«Object» 可选
返回值
- «Query»
Model.dropSearchIndex()
参数
name«String»
返回值
- «Promise»
按名称删除现有的Atlas 搜索索引。 此函数仅在连接到 MongoDB Atlas 时有效。
示例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.dropSearchIndex('test'); Model.ensureIndexes()
参数
[options]«Object» 内部选项
返回值
- «Promise»
为模式中声明的每个索引向 Mongo 发送createIndex 命令。 createIndex 命令按顺序发送。
示例
await Event.ensureIndexes();完成后,将在此Model 上发出一个index 事件,如果发生错误,则传递一个错误。
示例
const eventSchema = new Schema({ thing: { type: 'string', unique: true } })
const Event = mongoose.model('Event', eventSchema);
Event.on('index', function (err) {
if (err) console.error(err); // error occurred during index creation
});注意:不建议您在生产环境中运行此操作。 索引创建可能会影响数据库性能,具体取决于您的负载。 谨慎使用。
Model.estimatedDocumentCount()
参数
[options]«Object»
返回值
- «Query»
估计 MongoDB 集合中的文档数量。 比使用countDocuments() 更快,因为estimatedDocumentCount() 使用的是集合元数据,而不是扫描整个集合。
示例
const numAdventures = await Adventure.estimatedDocumentCount(); Model.events
类型
- «property»
事件发射器,报告发生的任何错误。 对全局错误处理很有用。
示例
MyModel.events.on('error', err => console.log(err.message));
// Prints a 'CastError' because of the above handler
await MyModel.findOne({ _id: 'Not a valid ObjectId' }).catch(noop); Model.exists()
参数
filter«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()
返回值
- «Query»
仅当数据库中存在至少一个与给定的filter 匹配的文档时,才返回包含_id 的文档;否则返回null。
在幕后,MyModel.exists({ answer: 42 }) 等效于MyModel.findOne({ answer: 42 }).select({ _id: 1 }).lean()
示例
await Character.deleteMany({});
await Character.create({ name: 'Jean-Luc Picard' });
await Character.exists({ name: /picard/i }); // { _id: ... }
await Character.exists({ name: /riker/i }); // null此函数触发以下中间件。
findOne()
Model.find()
参数
filter«Object|ObjectId»[projection]«Object|String|Array[String]» 要返回的可选字段,请参见Query.prototype.select()[options]«Object» 可选,请参见Query.prototype.setOptions()[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
查看
查找文档。
在发送命令之前,Mongoose 会将filter 强制转换为匹配模型模式。 有关 Mongoose 如何强制转换filter 的更多信息,请参见我们的查询强制转换教程。
示例
// find all documents
await MyModel.find({});
// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();
// executes, name LIKE john and only selecting the "name" and "friends" fields
await MyModel.find({ name: /john/i }, 'name friends').exec();
// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec(); Model.findById()
参数
id«Any» 要查询的_id的值[projection]«Object|String|Array[String]» 要返回的可选字段,请参见Query.prototype.select()[options]«Object» 可选,请参见Query.prototype.setOptions()
返回值
- «Query»
查看
通过其 _id 字段查找单个文档。 findById(id) 几乎*等效于findOne({ _id: id })。 如果您想按文档的_id 查询,请使用findById() 而不是findOne()。
在发送命令之前,id 会根据模式进行强制转换。
此函数触发以下中间件。
findOne()
* 除了它如何处理undefined。 如果您使用findOne(),您会发现findOne(undefined) 和findOne({ _id: undefined }) 等效于findOne({}),并返回任意文档。 但是,mongoose 会将findById(undefined) 转换为findOne({ _id: null })。
示例
// Find the adventure with the given `id`, or `null` if not found
await Adventure.findById(id).exec();
// select only the adventures name and length
await Adventure.findById(id, 'name length').exec(); Model.findByIdAndDelete()
参数
id«Object|Number|String» 要查询的_id的值[options]«Object» 可选,请参见Query.prototype.setOptions()[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
查看
通过文档的 _id 字段发出 MongoDB findOneAndDelete() 命令。 换句话说,findByIdAndDelete(id) 是findOneAndDelete({ _id: id }) 的简写。
此函数触发以下中间件。
findOneAndDelete()
Model.findByIdAndUpdate()
参数
id«Object|Number|String» 要查询的_id的值[update]«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.returnDocument='before']«String» 具有两个可能的值,'before'和'after'。 默认情况下,它将返回应用更新之前的文档。[options.lean]«Object» 如果为真,mongoose 将以纯 JavaScript 对象的形式返回文档,而不是 mongoose 文档。 请参见Query.lean()以及Mongoose 精简教程。[options.session=null]«ClientSession» 与此查询关联的会话。 请参见事务文档。[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.timestamps=null]«Boolean» 如果设置为false并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。[options.sort]«Object|String» 如果通过条件找到多个文档,则设置排序顺序以选择要更新的文档。[options.runValidators]«Boolean» 如果为真,则在此命令上运行更新验证器。 更新验证器会根据模型的模式验证更新操作。[options.setDefaultsOnInsert=true]«Boolean» 如果setDefaultsOnInsert和upsert为真,如果创建了新文档,mongoose 将应用模型模式中指定的默认值[options.includeResultMetadata]«Boolean» 如果为真,则返回来自 MongoDB 驱动的完整ModifyResult,而不是只返回文档。[options.upsert=false]«Boolean» 如果为真,并且未找到文档,则插入新文档。[options.new=false]«Boolean» 如果为真,则返回修改后的文档,而不是原始文档。[options.select]«Object|String» 设置要返回的文档字段。[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。[options.overwriteDiscriminatorKey=false]«布尔值» 默认情况下,Mongoose 会从update中删除鉴别器键的更新,将overwriteDiscriminatorKey设置为true以允许更新鉴别器键
返回值
- «Query»
查看
通过文档的 _id 字段发出 mongodb findOneAndUpdate 命令。findByIdAndUpdate(id, ...) 等效于 findOneAndUpdate({ _id: id }, ...)。
查找匹配的文档,根据 update 参数更新它,传递任何 options,并返回找到的文档(如果有)。
此函数触发以下中间件。
findOneAndUpdate()
示例
A.findByIdAndUpdate(id, update, options) // returns Query
A.findByIdAndUpdate(id, update) // returns Query
A.findByIdAndUpdate() // returns Query注意
所有不是 atomic 操作名称的顶层更新键都被视为设置操作
示例
Model.findByIdAndUpdate(id, { name: 'jason bourne' }, options)
// is sent as
Model.findByIdAndUpdate(id, { $set: { name: 'jason bourne' }}, options)注意
findOneAndX 和 findByIdAndX 函数支持有限的验证。可以通过设置 runValidators 选项来启用验证。
如果需要完整的验证,请使用传统的先检索文档的方法。
const doc = await Model.findById(id)
doc.name = 'jason bourne';
await doc.save(); Model.findOne()
参数
[conditions]«对象»[projection]«Object|String|Array[String]» 要返回的可选字段,请参见Query.prototype.select()[options]«Object» 可选,请参见Query.prototype.setOptions()[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
查看
查找一个文档。
在发送命令之前,conditions 会被转换为其各自的 SchemaTypes。
注意: conditions 是可选的,如果 conditions 为 null 或 undefined,mongoose 将向 MongoDB 发送一个空的 findOne 命令,该命令将返回一个任意文档。如果按 _id 查询,请使用 findById() 代替。
示例
// Find one adventure whose `country` is 'Croatia', otherwise `null`
await Adventure.findOne({ country: 'Croatia' }).exec();
// Model.findOne() no longer accepts a callback
// Select only the adventures name and length
await Adventure.findOne({ country: 'Croatia' }, 'name length').exec(); Model.findOneAndDelete()
参数
conditions«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.projection=null]«对象|字符串|字符串数组» 要返回的可选字段,请参见Query.prototype.select()[options.session=null]«ClientSession» 与此查询关联的会话。 请参见事务文档。[options.includeResultMetadata]«Boolean» 如果为真,则返回来自 MongoDB 驱动的完整ModifyResult,而不是只返回文档。[options.sort]«Object|String» 如果通过条件找到多个文档,则设置排序顺序以选择要更新的文档。[options.select]«Object|String» 设置要返回的文档字段。[options.maxTimeMS]«数字» 为查询设置时间限制 - 需要 mongodb >= 2.6.0[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
发出 MongoDB findOneAndDelete() 命令。
查找匹配的文档,将其删除,并返回找到的文档(如果有)。
此函数触发以下中间件。
findOneAndDelete()
示例
A.findOneAndDelete(conditions, options) // return Query
A.findOneAndDelete(conditions) // returns Query
A.findOneAndDelete() // returns QueryfindOneAndX 和 findByIdAndX 函数支持有限的验证。可以通过设置 runValidators 选项来启用验证。
如果需要完整的验证,请使用传统的先检索文档的方法。
const doc = await Model.findById(id)
doc.name = 'jason bourne';
await doc.save(); Model.findOneAndReplace()
参数
filter«对象» 替换与该过滤器匹配的第一个文档[replacement]«对象» 用此文档替换[options]«Object» 可选,请参见Query.prototype.setOptions()[options.returnDocument='before']«String» 具有两个可能的值,'before'和'after'。 默认情况下,它将返回应用更新之前的文档。[options.lean]«Object» 如果为真,mongoose 将以纯 JavaScript 对象的形式返回文档,而不是 mongoose 文档。 请参见Query.lean()以及Mongoose 精简教程。[options.session=null]«ClientSession» 与此查询关联的会话。 请参见事务文档。[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.timestamps=null]«Boolean» 如果设置为false并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。[options.projection=null]«对象|字符串|字符串数组» 要返回的可选字段,请参见Query.prototype.select()[options.sort]«Object|String» 如果通过条件找到多个文档,则设置排序顺序以选择要更新的文档。[options.includeResultMetadata]«Boolean» 如果为真,则返回来自 MongoDB 驱动的完整ModifyResult,而不是只返回文档。[options.select]«Object|String» 设置要返回的文档字段。[options.maxTimeMS]«数字» 为查询设置时间限制 - 需要 mongodb >= 2.6.0[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
发出 MongoDB findOneAndReplace() 命令。
查找匹配的文档,将其替换为提供的文档,并返回该文档。
此函数将触发以下查询中间件。
findOneAndReplace()
示例
A.findOneAndReplace(filter, replacement, options) // return Query
A.findOneAndReplace(filter, replacement) // returns Query
A.findOneAndReplace() // returns Query Model.findOneAndUpdate()
参数
[conditions]«对象»[update]«Object»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.returnDocument='before']«String» 具有两个可能的值,'before'和'after'。 默认情况下,它将返回应用更新之前的文档。[options.lean]«Object» 如果为真,mongoose 将以纯 JavaScript 对象的形式返回文档,而不是 mongoose 文档。 请参见Query.lean()以及Mongoose 精简教程。[options.session=null]«ClientSession» 与此查询关联的会话。 请参见事务文档。[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.timestamps=null]«Boolean» 如果设置为false并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。[options.upsert=false]«Boolean» 如果为真,并且未找到文档,则插入新文档。[options.projection=null]«对象|字符串|字符串数组» 要返回的可选字段,请参见Query.prototype.select()[options.new=false]«Boolean» 如果为真,则返回修改后的文档,而不是原始文档。[options.fields]«对象|字符串» 字段选择。等效于.select(fields).findOneAndUpdate()[options.maxTimeMS]«数字» 为查询设置时间限制 - 需要 mongodb >= 2.6.0[options.sort]«Object|String» 如果通过条件找到多个文档,则设置排序顺序以选择要更新的文档。[options.runValidators]«Boolean» 如果为真,则在此命令上运行更新验证器。 更新验证器会根据模型的模式验证更新操作。[options.setDefaultsOnInsert=true]«Boolean» 如果setDefaultsOnInsert和upsert为真,如果创建了新文档,mongoose 将应用模型模式中指定的默认值[options.includeResultMetadata]«布尔值» 如果为 true,则返回来自 MongoDB 驱动程序的 原始结果[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。[options.overwriteDiscriminatorKey=false]«布尔值» 默认情况下,Mongoose 会从update中删除鉴别器键的更新,将overwriteDiscriminatorKey设置为true以允许更新鉴别器键
返回值
- «Query»
查看
发出 mongodb findOneAndUpdate 命令。
查找匹配的文档,根据 update 参数更新它,传递任何 options,并将找到的文档(如果有)返回给回调。如果传递了 callback,则查询会执行,否则会返回 Query 对象。
示例
A.findOneAndUpdate(conditions, update, options) // returns Query
A.findOneAndUpdate(conditions, update) // returns Query
A.findOneAndUpdate() // returns Query注意
所有不是 atomic 操作名称的顶层更新键都被视为设置操作
示例
const query = { name: 'borne' };
Model.findOneAndUpdate(query, { name: 'jason bourne' }, options)
// is sent as
Model.findOneAndUpdate(query, { $set: { name: 'jason bourne' }}, options)注意
findOneAndX 和 findByIdAndX 函数支持有限的验证,可以通过设置 runValidators 选项来启用验证。
如果需要完整的验证,请使用传统的先检索文档的方法。
const doc = await Model.findById(id);
doc.name = 'jason bourne';
await doc.save(); Model.hydrate()
参数
obj«对象»[projection]«对象|字符串|字符串数组» 包含要为该文档选择的字段的可选投影[options]«对象» 可选选项[options.setters=false]«布尔值» 如果为 true,则在进行水化时应用模式设置器[options.hydratedPopulatedDocs=false]«布尔值» 如果为 true,则在传递预填充数据时填充文档
返回值
- «文档» 文档实例
从现有的原始数据(已预先保存在数据库中)创建新文档的快捷方式。返回的文档最初没有标记为已修改的路径。
示例
// hydrate previous data into a Mongoose document
const mongooseCandy = Candy.hydrate({ _id: '54108337212ffb6d459f854c', type: 'jelly bean' }); Model.init()
此函数负责根据模式选项初始化 MongoDB 中的基础连接。此函数执行以下操作
createCollection(),除非autoCreate选项被关闭ensureIndexes(),除非autoIndex选项被关闭- 如果启用了
autoSearchIndex,则在所有模式搜索索引上执行createSearchIndex()。
当使用 mongoose.model() 或 connection.model() 创建模型时,Mongoose 会自动调用此函数,因此无需调用 init() 来触发索引构建。
但是,如果需要获取索引完成后将解析的 Promise,则可能需要调用 init()。如果需要在继续操作之前等待索引构建,调用 await Model.init() 将很有帮助。例如,如果需要在继续执行测试用例之前等待唯一索引构建。
示例
const eventSchema = new Schema({ thing: { type: 'string', unique: true } })
// This calls `Event.init()` implicitly, so you don't need to call
// `Event.init()` on your own.
const Event = mongoose.model('Event', eventSchema);
await Event.init();
console.log('Indexes are done building!'); Model.insertMany()
参数
doc(s)«数组|对象|[对象 对象]»[options]«对象» 请参见 mongodb 驱动程序选项[options.ordered=true]«布尔值» 如果为 true,则在遇到第一个错误时快速失败。如果为 false,将插入所有可能的文档并稍后报告错误。具有ordered = false的insertMany()被称为“无序”insertMany()。[options.rawResult=false]«布尔值» 如果为 false,则返回的 Promise 解析为通过 mongoose 文档验证的文档。如果为true,将返回具有mongoose属性的来自 MongoDB 驱动程序的 原始结果,如果这是一个无序insertMany,则该属性包含validationErrors和results。[options.lean=false]«布尔值» 如果为true,则跳过对文档进行水化。这意味着 Mongoose 不会对传递给insertMany()的任何文档进行强制转换、验证或应用默认值。如果您需要额外的性能,此选项很有用,但存在数据完整性风险。请考虑与castObject()和applyDefaults()一起使用。[options.limit=null]«数字» 这将限制 mongoose 并行处理的文档数量(验证/强制转换),这不会将文档分批发送到 MongoDB。如果您正在处理大量文档并且您的应用程序内存不足,请使用此选项。[options.populate=null]«字符串|对象|数组» 填充结果文档。如果设置了rawResult,此选项将不起作用。[options.throwOnValidationError=false]«布尔值» 如果为 true 且ordered: false,如果其中一个操作验证失败,但所有有效操作都成功完成,则抛出错误。
返回值
- «Promise» 解析为来自 MongoDB 驱动程序的原始结果(如果
options.rawResult为true),否则解析为通过验证的文档
验证文档数组并将其插入 MongoDB(如果它们都有效)的快捷方式。此函数比 .create() 快,因为它只向服务器发送一个操作,而不是为每个文档发送一个操作。
Mongoose 始终在向 MongoDB 发送 insertMany 之前验证每个文档。因此,如果一个文档存在验证错误,则不会保存任何文档,除非您将 ordered 选项设置为 false。
此函数不会触发保存中间件。
此函数触发以下中间件。
insertMany()
示例
const docs = await Movies.insertMany([
{ name: 'Star Wars' },
{ name: 'The Empire Strikes Back' }
]);
docs[0].name; // 'Star Wars'
// Return raw result from MongoDB
const result = await Movies.insertMany([
{ name: 'Star Wars' },
{ name: 'The Empire Strikes Back' }
], { rawResult: true }); Model.inspect()
console.log 的辅助函数。给定一个名为“MyModel”的模型,返回字符串 'Model { MyModel }'。
示例
const MyModel = mongoose.model('Test', Schema({ name: String }));
MyModel.inspect(); // 'Model { Test }'
console.log(MyModel); // Prints 'Model { Test }' Model.listIndexes()
返回值
- «Promise»
列出当前在 MongoDB 中定义的索引。这可能与您在模式中定义的索引相同,也可能不同,具体取决于您是否使用 autoIndex 选项 以及是否手动构建索引。
Model.listSearchIndexes()
参数
[options]«Object»
返回值
- «Promise<数组>»
列出此模型集合上的所有 Atlas 搜索索引。此函数仅在连接到 MongoDB Atlas 时有效。
示例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.createSearchIndex({ name: 'test', definition: { mappings: { dynamic: true } } });
const res = await Customer.listSearchIndexes(); // Includes `[{ name: 'test' }]` Model.populate()
参数
docs«文档|数组» 要填充的单个文档或文档数组。options«对象|字符串» 要填充的路径,或者指定所有参数的对象[options.path=null]«字符串» 要填充的路径。[options.populate=null]«字符串|PopulateOptions» 递归填充填充文档中的路径。请参见 深度填充文档。[options.retainNullValues=false]«布尔值» 默认情况下,Mongoose 会从填充的数组中删除 null 和 undefined 值。使用此选项使populate()保留null和undefined数组条目。[options.getters=false]«布尔值» 如果为 true,Mongoose 将调用localField上定义的任何设置器。默认情况下,Mongoose 获取localField的原始值。例如,如果您想 在localField上添加lowercase设置器,则需要将此选项设置为true。[options.clone=false]«布尔值» 当您执行BlogPost.find().populate('author')时,具有相同作者的博客文章将共享author文档的 1 个副本。启用此选项以使 Mongoose 在分配之前克隆填充的文档。[options.match=null]«对象|函数» 向填充查询添加额外的过滤器。可以是包含 MongoDB 查询语法 的过滤器对象,也可以是返回过滤器对象的函数。[options.skipInvalidIds=false]«布尔值» 默认情况下,如果localField和foreignField模式不匹配,Mongoose 会抛出强制转换错误。如果启用此选项,Mongoose 将改为过滤掉任何无法强制转换为foreignField模式类型的所有localField属性。[options.perDocumentLimit=null]«数字» 出于遗留原因,limit与populate()一起使用可能会产生不正确的结果,因为它只为每个要填充的文档执行一个查询。如果您设置perDocumentLimit,Mongoose 将通过为每个要populate()的文档执行单独的查询来确保每个文档的正确limit。例如,.find().populate({ path: 'test', perDocumentLimit: 2 })如果.find()返回 2 个文档,将执行 2 个额外的查询。[options.strictPopulate=true]«布尔值» 设置为 false 以允许填充给定模型模式中未定义的路径。[options.options=null]«对象» 其他选项,如limit和lean。[options.transform=null]«函数» Mongoose 将在每个填充文档上调用的函数,允许您转换填充的文档。[callback(err,doc)]«函数» 可选的回调函数,在完成时执行。接收err和doc(s)。
返回值
- «Promise»
填充文档引用。
在 Mongoose 6 中更改:您调用 populate() 的模型应该是“本地字段”模型,而不是“外键字段”模型。
可用的顶层选项
- path:要填充的空间分隔路径
- select:要选择的可选字段
- match:要匹配的可选查询条件
- model:用于填充的模型的可选名称
- options:可选的查询选项,如 sort、limit 等
- justOne:可选的布尔值,如果为 true,Mongoose 将始终将
path设置为文档,如果未找到文档,则设置为null。如果为 false,Mongoose 将始终将path设置为数组,如果未找到文档,则该数组将为空。默认情况下从模式推断。 - strictPopulate:可选的布尔值,设置为
false以允许填充模式中不存在的路径。
示例
const Dog = mongoose.model('Dog', new Schema({ name: String, breed: String }));
const Person = mongoose.model('Person', new Schema({
name: String,
pet: { type: mongoose.ObjectId, ref: 'Dog' }
}));
const pets = await Pet.create([
{ name: 'Daisy', breed: 'Beagle' },
{ name: 'Einstein', breed: 'Catalan Sheepdog' }
]);
// populate many plain objects
const users = [
{ name: 'John Wick', dog: pets[0]._id },
{ name: 'Doc Brown', dog: pets[1]._id }
];
await User.populate(users, { path: 'dog', select: 'name' });
users[0].dog.name; // 'Daisy'
users[0].dog.breed; // undefined because of `select` Model.prototype.$model()
参数
[name]«字符串» 模型名称
返回值
- «模型»
如果未指定 name,则返回用于创建此文档的模型实例。如果指定了 name,则返回具有给定 name 的模型。
示例
const doc = new Tank({});
doc.$model() === Tank; // true
await doc.$model('User').findById(id); Model.prototype.$where
类型
- «property»
在调用 save() 且 isNew 为 false 时附加到查询的其他属性。
Model.prototype.base
类型
- «property»
模型使用的基本 Mongoose 实例。
Model.prototype.baseModelName
类型
- «property»
如果这是一个鉴别器模型,则 baseModelName 是基本模型的名称。
Model.prototype.collection
类型
- «property»
此模型使用的集合实例。Mongoose 集合是围绕 [MongoDB Node.js 驱动程序集合](MongoDB Node.js 驱动程序集合) 的一个薄包装器。使用 Model.collection 表示您绕过了 Mongoose 中间件、验证和强制转换。
此属性是只读的。修改此属性将不起作用。
Model.prototype.collection
类型
- «property»
模型使用的集合。
Model.prototype.db
类型
- «property»
模型使用的连接。
Model.prototype.deleteOne()
返回值
- «查询» 查询
Model.prototype.discriminators
类型
- «property»
为该模型注册的鉴别器。
Model.prototype.increment()
查看
Model.prototype.model()
参数
[name]«字符串» 模型名称
返回值
- «模型»
如果未指定 name,则返回用于创建此文档的模型实例。如果指定了 name,则返回具有给定 name 的模型。
示例
const doc = new Tank({});
doc.$model() === Tank; // true
await doc.$model('User').findById(id); Model.prototype.modelName
类型
- «property»
模型的名称
Model.prototype.save()
参数
[options]«对象» options 可选选项[options.safe]«对象» (已弃用) 覆盖 模式的 safe 选项。请改用w选项。[options.validateBeforeSave]«布尔值» 设置为 false 以在不验证的情况下保存。[options.validateModifiedOnly=false]«布尔值» 如果为true,Mongoose 只会验证修改过的路径,而不是修改过的路径和required路径。[options.w]«数字|字符串» 设置 写入关注。覆盖 模式级writeConcern选项[options.j]«布尔值» 设置为 true 以使 MongoDB 在已 记录此save()之前解决返回的 Promise。覆盖 模式级writeConcern选项[options.wtimeout]«数字» 设置 写入关注的超时。覆盖 模式级writeConcern选项。[options.checkKeys=true]«布尔值» MongoDB 驱动程序默认情况下会阻止您保存以 '$' 开头或包含 '.' 的键。将此选项设置为false以跳过该检查。参见 字段名称限制[options.timestamps=true]«布尔值» 如果为false且 时间戳 已启用,则跳过此save()的时间戳。[options.pathsToSave]«数组» 一个路径数组,告诉 mongoose 只验证和保存pathsToSave中的路径。
返回值
- «Promise»
查看
如果 document.isNew 为 true,则通过将新文档插入数据库来保存此文档,或者如果 isNew 为 false,则发送仅包含修改过的路径的 updateOne 操作。
示例
product.sold = Date.now();
product = await product.save();如果保存成功,返回的 Promise 将会使用保存的文档来实现。
示例
const newProduct = await product.save();
newProduct === product; // true Model.recompileSchema()
返回值
- «undefined,void»
在编译此模型后应用对此模型模式所做的更改。默认情况下,在编译模型后将虚拟和其他属性添加到模式不会有任何效果。调用此函数以应用以后添加的虚拟和属性。
示例
const schema = new mongoose.Schema({ field: String });
const TestModel = mongoose.model('Test', schema);
TestModel.schema.virtual('myVirtual').get(function() {
return this.field + ' from myVirtual';
});
const doc = new TestModel({ field: 'Hello' });
doc.myVirtual; // undefined
TestModel.recompileSchema();
doc.myVirtual; // 'Hello from myVirtual' Model.replaceOne()
参数
filter«Object»doc«对象»[options]«Object» 可选,请参见Query.prototype.setOptions()[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.upsert=false]«Boolean» 如果为真,并且未找到文档,则插入新文档。[options.timestamps=null]«布尔值» 如果设置为false且 模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会有任何效果。[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。
返回值
- «Query»
查看
用给定的文档替换现有文档(没有像 $set 这样的原子运算符)。
示例
const res = await Person.replaceOne({ _id: 24601 }, { name: 'Jean Valjean' });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.此函数触发以下中间件。
replaceOne()
Model.schema
类型
- «property»
模型使用的模式。
Model.startSession()
参数
[options]«对象» 请参阅 mongodb 驱动程序选项[options.causalConsistency=true]«布尔值» 设置为 false 以禁用因果一致性
返回值
- «Promise<ClientSession>» 解决为 MongoDB 驱动程序
ClientSession的 Promise
需要 MongoDB >= 3.6.0. 为诸如因果一致性、可重试写入 和 事务 之类的优势启动 MongoDB 会话。
调用 MyModel.startSession() 等效于调用 MyModel.db.startSession()。
此函数不会触发任何中间件。
示例
const session = await Person.startSession();
let doc = await Person.findOne({ name: 'Ned Stark' }, null, { session });
await doc.remove();
// `doc` will always be null, even if reading from a replica set
// secondary. Without causal consistency, it is possible to
// get a doc back from the below query if the query reads from a
// secondary that is experiencing replication lag.
doc = await Person.findOne({ name: 'Ned Stark' }, null, { session, readPreference: 'secondary' }); Model.syncIndexes()
参数
[options]«对象» 传递给ensureIndexes()的选项[options.background=null]«布尔值» 如果指定,则覆盖每个索引的background属性
返回值
- «Promise»
使 MongoDB 中的索引与在此模型模式中定义的索引相匹配。此函数将删除模型模式中未定义的任何索引(_id 索引除外),并构建模式中存在但在 MongoDB 中不存在的任何索引。
请参阅 介绍性博客文章 以了解更多信息。
示例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.collection.createIndex({ age: 1 }); // Index is not in schema
// Will drop the 'age' index and create an index on `name`
await Customer.syncIndexes();您应该谨慎地在负载较大的生产应用程序上运行 syncIndexes(),因为索引构建是昂贵的操作,意外的索引删除会导致性能下降。在运行 syncIndexes() 之前,您可以使用 diffIndexes() 函数 来检查 syncIndexes() 将删除和创建哪些索引。
示例
const { toDrop, toCreate } = await Model.diffIndexes();
toDrop; // Array of strings containing names of indexes that `syncIndexes()` will drop
toCreate; // Array of strings containing names of indexes that `syncIndexes()` will create Model.translateAliases()
参数
fields«对象» 可能包含别名键的字段/条件[errorOnDuplicates]«布尔值» 如果为 true,则如果fields中同时存在键和该键的别名,则抛出错误
返回值
- «对象» 翻译后的“纯”字段/条件
翻译任何别名字段/条件,以便最终的查询或文档对象是纯净的
示例
await Character.find(Character.translateAliases({
'名': 'Eddard Stark' // Alias for 'name'
});默认情况下,translateAliases() 会用别名字段覆盖原始字段。因此,如果 n 是 name 的别名,{ n: 'alias', name: 'raw' } 将解析为 { name: 'alias' }。但是,您可以设置 errorOnDuplicates 选项,如果存在可能冲突的路径,则抛出错误。查询的 translateAliases 选项使用 errorOnDuplicates。
注意
只翻译对象类型的参数,其他任何内容都将被原始返回
Model.updateMany()
参数
filter«Object»update.«对象|数组» 如果为数组,此更新将被视为更新管道,而不是被转换。[options]«Object» 可选,请参见Query.prototype.setOptions()[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.upsert=false]«Boolean» 如果为真,并且未找到文档,则插入新文档。[options.timestamps=null]«布尔值» 如果设置为false且 模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会有任何效果。[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。[options.overwriteDiscriminatorKey=false]«布尔值» 默认情况下,Mongoose 会从update中删除鉴别器键的更新,将overwriteDiscriminatorKey设置为true以允许更新鉴别器键
返回值
- «Query»
查看
与 updateOne() 相同,但 MongoDB 会更新与 filter 匹配的所有文档(而不是仅第一个文档),而不管 multi 选项的值如何。
注意 updateMany 不会 触发更新中间件。请改用 pre('updateMany') 和 post('updateMany')。
示例
const res = await Person.updateMany({ name: /Stark$/ }, { isDeleted: true });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation. This may be false if Mongoose did not send an update to the server because the update was empty.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.此函数触发以下中间件。
updateMany()
Model.updateOne()
参数
filter«Object»update.«对象|数组» 如果为数组,此更新将被视为更新管道,而不是被转换。[options]«Object» 可选,请参见Query.prototype.setOptions()[options.strict]«Boolean|String» 覆盖模式的严格模式选项[options.upsert=false]«Boolean» 如果为真,并且未找到文档,则插入新文档。[options.timestamps=null]«Boolean» 如果设置为false并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。[options.translateAliases=null]«Boolean» 如果设置为true,则会将filter、projection、update和distinct中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。[options.overwriteDiscriminatorKey=false]«布尔值» 默认情况下,Mongoose 会从update中删除鉴别器键的更新,将overwriteDiscriminatorKey设置为true以允许更新鉴别器键
返回值
- «Query»
查看
仅更新与 filter 匹配的第一个文档。
- 如果要覆盖整个文档而不是使用像
$set这样的原子运算符,请使用replaceOne()。
示例
const res = await Person.updateOne({ name: 'Jean-Luc Picard' }, { ship: 'USS Enterprise' });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation. This may be false if Mongoose did not send an update to the server because the update was empty.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.此函数触发以下中间件。
updateOne()
Model.updateSearchIndex()
参数
name«String»definition«对象»
返回值
- «Promise»
更新现有的 Atlas 搜索索引。此函数仅在连接到 MongoDB Atlas 时有效。
示例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.updateSearchIndex('test', { mappings: { dynamic: true } }); Model.validate()
参数
obj«对象»pathsOrOptions«对象|数组|字符串»[context]«对象»
返回值
- «Promise<对象>» 如果验证成功,则为
obj的转换和验证后的副本
根据此模型的模式转换和验证给定的对象,并将给定的 context 传递给自定义验证器。
示例
const Model = mongoose.model('Test', Schema({
name: { type: String, required: true },
age: { type: Number, required: true }
});
try {
await Model.validate({ name: null }, ['name'])
} catch (err) {
err instanceof mongoose.Error.ValidationError; // true
Object.keys(err.errors); // ['name']
} Model.watch()
参数
[pipeline]«数组»[options]«对象» 请参阅 mongodb 驱动程序选项[options.hydrate=false]«布尔值» 如果为 true 且fullDocument: 'updateLookup'已设置,则 Mongoose 将自动将fullDocument转换为完整的 Mongoose 文档
返回值
- «ChangeStream» mongoose 特定的变更流包装器,继承自 EventEmitter
需要运行 MongoDB >= 3.6.0 的副本集。 使用 MongoDB 变更流 监控基础集合的更改。
此函数不会触发任何中间件。特别是,它不会触发聚合中间件。
ChangeStream 对象是一个事件发射器,它会发出以下事件
- 'change': 发生了更改,请参阅以下示例
- 'error': 发生了不可恢复的错误。特别是,如果变更流丢失与副本集主节点的连接,则当前会出错。关注 此 GitHub 问题 以获取更新。
- 'end': 如果基础流已关闭,则发出
- 'close': 如果基础流已关闭,则发出
示例
const doc = await Person.create({ name: 'Ned Stark' });
const changeStream = Person.watch().on('change', change => console.log(change));
// Will print from the above `console.log()`:
// { _id: { _data: ... },
// operationType: 'delete',
// ns: { db: 'mydb', coll: 'Person' },
// documentKey: { _id: 5a51b125c5500f5aa094c7bd } }
await doc.remove(); Model.where()
参数
path«字符串»[val]«对象» 可选值
返回值
- «Query»
创建一个 Query,应用传入的条件,并返回 Query。
例如,而不是编写
User.find({ age: { $gte: 21, $lte: 65 } });我们可以改为编写
User.where('age').gte(21).lte(65).exec();由于 Query 类也支持 where,因此您可以继续链接
User
.where('age').gte(21).lte(65)
.where('name', /^b/i)
... etc 
