模型
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.db
Model.deleteMany()
Model.deleteOne()
Model.diffIndexes()
Model.discriminator()
Model.distinct()
Model.dropSearchIndex()
Model.ensureIndexes()
Model.estimatedDocumentCount()
Model.events
Model.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.$where
Model.prototype.base
Model.prototype.baseModelName
Model.prototype.collection
Model.prototype.collection
Model.prototype.db
Model.prototype.deleteOne()
Model.prototype.discriminators
Model.prototype.increment()
Model.prototype.model()
Model.prototype.modelName
Model.prototype.save()
Model.recompileSchema()
Model.replaceOne()
Model.schema
Model.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
}
}]);
支持的操作包括:
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
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://www.mongodb.com/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
和definition
description.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 Query
findOneAndX
和 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