模型


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.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.upsert=false] «Boolean» 如果为 true,则在没有匹配项时插入文档

    • [ops.updateOne.timestamps=true] «Boolean» 如果为 false,则不要对操作应用 时间戳

    • [ops.updateOne.arrayFilters] «Array»update 中使用的 数组过滤器

    • [ops.updateMany.filter] «Object» 更新与该过滤器匹配的所有文档

    • [ops.updateMany.upsert=false] «Boolean» 如果为 true,则在没有文档与 filter 匹配时插入文档

    • [ops.updateMany.timestamps=true] «Boolean» 如果为 false,则不要对操作应用 时间戳

    • [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.j=true] «Boolean» 如果为 false,则禁用 日志确认

    • [options.skipValidation=false] «Boolean» 设置为 true 以跳过批量写入操作的 Mongoose 模式验证。目前,Mongoose 默认情况下对 insertOnereplaceOne 操作运行验证。

    • [options.throwOnValidationError=false] «Boolean» 如果为 true 且 ordered: false,则如果操作之一验证失败,但所有有效的操作都成功完成,则抛出错误。请注意,Mongoose 仍然会将所有有效的操作发送到 MongoDB 服务器。

    • [options.strict=null] «Boolean|[object Object]» 覆盖模式上的 strict 选项。如果为 false,则允许过滤和写入此批量中所有写入的模式中未定义的字段。

返回值

将多个 insertOneupdateOneupdateManyreplaceOnedeleteOne 和/或 deleteMany 操作作为单个命令发送到 MongoDB 服务器。这比发送多个独立的操作更快(例如,如果您使用 create()),因为使用 bulkWrite() 只需与 MongoDB 进行一次往返。

Mongoose 将对您提供的操作执行转换。唯一的例外是 updateOneupdateManyupdate 运算符设置为管道: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()不支持的操作符,以及建议的替代方案


Model.create()

参数
  • docs «Array|Object» 要插入的文档,作为扩展或数组

  • [options] «Object» 传递给save()的选项。 要指定optionsdocs **必须** 是一个数组,而不是扩展。 有关可用选项,请参见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()

参数

创建此模型的集合。 默认情况下,如果未指定任何索引,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» 索引选项,包括namedefinition

  • 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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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»

distinct 操作创建一个查询。

示例

const query = Link.distinct('url');
query.exec();

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

参数
返回值
  • «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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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()

参数
返回值
  • «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.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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.timestamps=null] «Boolean» 如果设置为false 并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。

    • [options.sort] «Object|String» 如果通过条件找到多个文档,则设置排序顺序以选择要更新的文档。

    • [options.runValidators] «Boolean» 如果为真,则在此命令上运行更新验证器。 更新验证器会根据模型的模式验证更新操作。

    • [options.setDefaultsOnInsert=true] «Boolean» 如果setDefaultsOnInsertupsert 为真,如果创建了新文档,mongoose 将应用模型模式中指定的默认值

    • [options.includeResultMetadata] «Boolean» 如果为真,则返回来自 MongoDB 驱动的完整ModifyResult,而不是只返回文档。

    • [options.upsert=false] «Boolean» 如果为真,并且未找到文档,则插入新文档。

    • [options.new=false] «Boolean» 如果为真,则返回修改后的文档,而不是原始文档。

    • [options.select] «Object|String» 设置要返回的文档字段。

    • [options.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

    • [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)

注意

findOneAndXfindByIdAndX 函数支持有限的验证。可以通过设置 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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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.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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «Query»

发出 MongoDB findOneAndDelete() 命令。

查找匹配的文档,将其删除,并返回找到的文档(如果有)。

此函数触发以下中间件。

  • findOneAndDelete()

示例

A.findOneAndDelete(conditions, options)  // return Query
A.findOneAndDelete(conditions) // returns Query
A.findOneAndDelete()           // returns Query

findOneAndXfindByIdAndX 函数支持有限的验证。可以通过设置 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.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,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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.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» 如果setDefaultsOnInsertupsert 为真,如果创建了新文档,mongoose 将应用模型模式中指定的默认值

    • [options.includeResultMetadata] «布尔值» 如果为 true,则返回来自 MongoDB 驱动程序的 原始结果

    • [options.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

    • [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)

注意

findOneAndXfindByIdAndX 函数支持有限的验证,可以通过设置 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 = falseinsertMany() 被称为“无序”insertMany()

    • [options.rawResult=false] «布尔值» 如果为 false,则返回的 Promise 解析为通过 mongoose 文档验证的文档。如果为 true,将返回具有 mongoose 属性的来自 MongoDB 驱动程序的 原始结果,如果这是一个无序 insertMany,则该属性包含 validationErrorsresults

    • [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.rawResulttrue),否则解析为通过验证的文档

验证文档数组并将其插入 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() 保留 nullundefined 数组条目。

    • [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] «布尔值» 默认情况下,如果 localFieldforeignField 模式不匹配,Mongoose 会抛出强制转换错误。如果启用此选项,Mongoose 将改为过滤掉任何无法强制转换为 foreignField 模式类型的所有 localField 属性。

    • [options.perDocumentLimit=null] «数字» 出于遗留原因,limitpopulate() 一起使用可能会产生不正确的结果,因为它只为每个要填充的文档执行一个查询。如果您设置 perDocumentLimit,Mongoose 将通过为每个要 populate() 的文档执行单独的查询来确保每个文档的正确 limit。例如,.find().populate({ path: 'test', perDocumentLimit: 2 }) 如果 .find() 返回 2 个文档,将执行 2 个额外的查询。

    • [options.strictPopulate=true] «布尔值» 设置为 false 以允许填充给定模型模式中未定义的路径。

    • [options.options=null] «对象» 其他选项,如 limitlean

    • [options.transform=null] «函数» Mongoose 将在每个填充文档上调用的函数,允许您转换填充的文档。

  • [callback(err,doc)] «函数» 可选的回调函数,在完成时执行。接收 errdoc(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()

返回值
  • «查询» 查询

从数据库中删除此文档。

示例

await product.deleteOne();
await Product.findById(product._id); // null

Model.prototype.discriminators

类型
  • «property»

为该模型注册的鉴别器。


Model.prototype.increment()

查看

发出我们希望此文档版本增量的信号。

示例

const doc = await Model.findById(id);
doc.increment();
await doc.save();

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.validateBeforeSave] «布尔值» 设置为 false 以在不验证的情况下保存。

    • [options.validateModifiedOnly=false] «布尔值» 如果为 true,Mongoose 只会验证修改过的路径,而不是修改过的路径和 required 路径。

    • [options.checkKeys=true] «布尔值» MongoDB 驱动程序默认情况下会阻止您保存以 '$' 开头或包含 '.' 的键。将此选项设置为 false 以跳过该检查。参见 字段名称限制

    • [options.timestamps=true] «布尔值» 如果为 false时间戳 已启用,则跳过此 save() 的时间戳。

    • [options.pathsToSave] «数组» 一个路径数组,告诉 mongoose 只验证和保存 pathsToSave 中的路径。

返回值
  • «Promise»
查看

如果 document.isNewtrue,则通过将新文档插入数据库来保存此文档,或者如果 isNewfalse,则发送仅包含修改过的路径的 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.upsert=false] «Boolean» 如果为真,并且未找到文档,则插入新文档。

    • [options.timestamps=null] «布尔值» 如果设置为 false模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会有任何效果。

    • [options.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

返回值
  • «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() 会用别名字段覆盖原始字段。因此,如果 nname 的别名,{ n: 'alias', name: 'raw' } 将解析为 { name: 'alias' }。但是,您可以设置 errorOnDuplicates 选项,如果存在可能冲突的路径,则抛出错误。查询的 translateAliases 选项使用 errorOnDuplicates

注意

只翻译对象类型的参数,其他任何内容都将被原始返回


Model.updateMany()

参数
  • filter «Object»
  • update. «对象|数组» 如果为数组,此更新将被视为更新管道,而不是被转换。

  • [options] «Object» 可选,请参见Query.prototype.setOptions()

    • [options.upsert=false] «Boolean» 如果为真,并且未找到文档,则插入新文档。

    • [options.timestamps=null] «布尔值» 如果设置为 false模式级时间戳 已启用,则跳过此更新的时间戳。如果模式级时间戳未设置,则不会有任何效果。

    • [options.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

    • [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.upsert=false] «Boolean» 如果为真,并且未找到文档,则插入新文档。

    • [options.timestamps=null] «Boolean» 如果设置为false 并且启用了模式级时间戳,则跳过此更新的时间戳。 请注意,这允许您覆盖时间戳。 如果未设置模式级时间戳,则不会执行任何操作。

    • [options.translateAliases=null] «Boolean» 如果设置为true,则会将filterprojectionupdatedistinct 中的任何模式定义的别名进行转换。 如果在同一个对象上定义了别名和原始属性,并且存在冲突,则会抛出错误。

    • [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