Mongoose 是一个 Node.js 的 ORM(Object Relational Mapping)库,它提供了一种方便的方式来操作 MongoDB 数据库。在 Mongoose 中,我们可以使用 update 方法来更新数据库中的文档。
在本文中,我们将深入探讨 Mongoose 中 update 方法的附加性,包括其可选参数、返回值和使用示例。通过学习本文,你将能够更好地使用 Mongoose 来操作 MongoDB 数据库。
update 方法的基本使用
update 方法是 Mongoose 中用于更新文档的方法,其基本使用方法如下所示:
Model.update(conditions, update, options, callback)
其中,各参数的含义如下:
- conditions:用于筛选要更新的文档的条件,可以是一个对象或一个查询语句。
- update:用于更新文档的数据,可以是一个对象或一个更新操作符。
- options:可选参数,可以指定是否返回更新后的文档、是否启用写关注、是否强制更新等。详见下文。
- callback:回调函数,用于处理更新结果。
例如,我们可以使用以下代码来将 name 为 Alice 的文档的 age 字段更新为 18:
Model.update({ name: 'Alice' }, { age: 18 }, (err, res) => { if (err) throw err; console.log(res); });
可选参数
除了必选参数之外,update 方法还支持一些可选参数,这些参数可以用于指定一些更新选项。下面是 update 方法支持的可选参数:
multi
- 类型:Boolean
- 默认值:false
multi 参数用于指定是否更新多个文档。如果设置为 true,则会更新所有符合条件的文档,否则只会更新第一个符合条件的文档。
例如,我们可以使用以下代码来将所有 age 大于等于 18 的文档的 isAdult 字段设置为 true:
Model.update({ age: { $gte: 18 } }, { isAdult: true }, { multi: true }, (err, res) => { if (err) throw err; console.log(res); });
upsert
- 类型:Boolean
- 默认值:false
upsert 参数用于指定是否启用 upsert 功能。如果设置为 true,则会在没有符合条件的文档时创建一个新文档。
例如,我们可以使用以下代码来更新 name 为 Bob 的文档,如果不存在则创建一个新文档:
Model.update({ name: 'Bob' }, { age: 20 }, { upsert: true }, (err, res) => { if (err) throw err; console.log(res); });
overwrite
- 类型:Boolean
- 默认值:false
overwrite 参数用于指定是否强制更新整个文档。如果设置为 true,则会用 update 中的数据替换整个文档,否则只会更新 update 中指定的字段。
例如,我们可以使用以下代码来将 name 为 Alice 的文档的数据完全替换为 { name: 'Alice', age: 18 }:
Model.update({ name: 'Alice' }, { name: 'Alice', age: 18 }, { overwrite: true }, (err, res) => { if (err) throw err; console.log(res); });
runValidators
- 类型:Boolean
- 默认值:false
runValidators 参数用于指定是否启用验证器。如果设置为 true,则会在更新前对 update 中的数据进行验证,如果验证失败则会抛出错误。
例如,我们可以使用以下代码来更新 age 大于等于 18 的文档的 age 字段为 20,如果 age 小于 18 则会抛出错误:
Model.update({ age: { $gte: 18 } }, { age: 20 }, { runValidators: true }, (err, res) => { if (err) throw err; console.log(res); });
setDefaultsOnInsert
- 类型:Boolean
- 默认值:false
setDefaultsOnInsert 参数用于指定是否在 upsert 时设置默认值。如果设置为 true,则会在 upsert 时将模型定义中的默认值设置到新文档中。
例如,我们可以使用以下代码来更新 name 为 Bob 的文档,如果不存在则创建一个新文档,并将模型定义中的默认值设置到新文档中:
Model.update({ name: 'Bob' }, { age: 20 }, { upsert: true, setDefaultsOnInsert: true }, (err, res) => { if (err) throw err; console.log(res); });
timestamps
- 类型:Boolean/Object
- 默认值:false
timestamps 参数用于指定是否启用时间戳功能。如果设置为 true,则会在更新时自动更新 updatedAt 字段,如果不存在则会创建一个新字段 createdAt。
如果 timestamps 参数的值是一个对象,则可以指定 createdAt 和 updatedAt 字段的名称。
例如,我们可以使用以下代码来更新 name 为 Alice 的文档,并自动更新 updatedAt 字段:
Model.update({ name: 'Alice' }, { age: 19 }, { timestamps: true }, (err, res) => { if (err) throw err; console.log(res); });
返回值
update 方法的返回值是一个 Promise 对象或一个回调函数。如果使用 Promise,则会在更新完成后返回更新结果。如果使用回调函数,则会在更新完成后调用回调函数,并将更新结果作为参数传递给回调函数。
更新结果是一个对象,其中包含以下属性:
- n:更新的文档数量。
- nModified:实际更新的文档数量。如果使用了 upsert 或者 overwrite 参数,则 nModified 可能小于 n。
- ok:更新是否成功。
例如,我们可以使用以下代码来输出更新结果:
Model.update({ name: 'Alice' }, { age: 19 }).then((res) => { console.log(res); // { n: 1, nModified: 1, ok: 1 } }).catch((err) => { throw err; });
使用示例
下面是一些使用 update 方法的示例代码:
将所有文档的 age 字段加 1
Model.update({}, { $inc: { age: 1 } }, { multi: true }, (err, res) => { if (err) throw err; console.log(res); });
将所有 age 大于等于 18 的文档的 isAdult 字段设置为 true
Model.update({ age: { $gte: 18 } }, { isAdult: true }, { multi: true }, (err, res) => { if (err) throw err; console.log(res); });
将 name 为 Alice 的文档的 age 字段更新为 19
Model.update({ name: 'Alice' }, { age: 19 }, (err, res) => { if (err) throw err; console.log(res); });
将 name 为 Bob 的文档的 age 字段更新为 20,如果不存在则创建一个新文档
Model.update({ name: 'Bob' }, { age: 20 }, { upsert: true }, (err, res) => { if (err) throw err; console.log(res); });
将所有 age 大于等于 18 的文档的 age 字段更新为 20,如果 age 小于 18 则会抛出错误
Model.update({ age: { $gte: 18 } }, { age: 20 }, { runValidators: true }, (err, res) => { if (err) throw err; console.log(res); });
将 name 为 Bob 的文档的 age 字段更新为 20,如果不存在则创建一个新文档,并将模型定义中的默认值设置到新文档中
Model.update({ name: 'Bob' }, { age: 20 }, { upsert: true, setDefaultsOnInsert: true }, (err, res) => { if (err) throw err; console.log(res); });
将 name 为 Alice 的文档的数据完全替换为 { name: 'Alice', age: 18 }
Model.update({ name: 'Alice' }, { name: 'Alice', age: 18 }, { overwrite: true }, (err, res) => { if (err) throw err; console.log(res); });
将 name 为 Alice 的文档的数据完全替换为 { name: 'Alice', age: 19 },并自动更新 updatedAt 字段
Model.update({ name: 'Alice' }, { name: 'Alice', age: 19 }, { timestamps: true, overwrite: true }, (err, res) => { if (err) throw err; console.log(res); });
总结
本文对 Mongoose 中 update 方法的附加性进行了详细的解析,包括其可选参数、返回值和使用示例。通过学习本文,你将能够更好地使用 Mongoose 来操作 MongoDB 数据库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6573e401d2f5e1655dd14d1e