Mongoose 是一个 Node.js 的 ORM(对象关系映射)库,用于操作 MongoDB 数据库。它提供了高效的查询构建、模型定义、生命周期钩子等功能,同时也兼容各种 Node.js 框架,如 Express、Koa 等。本文将介绍 Mongoose 的基础操作,包括连接、模型定义、查询、更新、删除等。
连接 MongoDB 数据库
在使用 Mongoose 之前,需要先连接 MongoDB 数据库。我们可以使用 mongoose.connect()
方法进行连接,同时还可以设置一些连接选项,如:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/myDB', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }).then(() => { console.log('MongoDB connected!'); }).catch(err => { console.log(`MongoDB connection error: ${err}`); });
其中,mongodb://localhost/myDB
表示连接本地的 myDB 数据库。其他参数的含义如下:
useNewUrlParser
: 使用新的 URL 解析器,避免出现 URL 解析错误。useUnifiedTopology
: 使用新的连接管理引擎,避免出现奇怪的连接错误。useCreateIndex
: 在定义模型时自动创建索引,避免手动创建索引时出错。useFindAndModify
: 使用新的查找和修改引擎,避免出现过去版本的问题。
定义模型
在 Mongoose 中,模型是指与数据库中的集合(collection)相对应的构造函数。我们可以使用 mongoose.Schema
方法定义集合的 Schema(结构),再使用 mongoose.model
方法将 Schema 转换为模型,如:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); // 定义集合的 Schema const userSchema = new mongoose.Schema({ username: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now }, updatedAt: { type: Date, default: Date.now } }); // 将 Schema 转换为模型 const User = mongoose.model('User', userSchema);
其中,userSchema
定义了集合的结构,包括用户名、邮箱、密码、创建时间和更新时间等字段。User
是将 userSchema
转换为模型后的构造函数,即与集合相对应的模型。
查询操作
Mongoose 提供了丰富的查询操作,包括条件查询、投影查询、排序查询、分页查询、聚合查询等。下面分别介绍这些操作。
条件查询
条件查询是指根据指定的条件对集合进行查询,常用的条件操作符包括 $eq
、$ne
、$gt
、$lt
、$gte
、$lte
、$in
、$nin
、$or
、$and
、$not
等。举个例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 查询用户名为 Alice 的用户 User.findOne({ username: 'Alice' }, (err, user) => { if (err) { console.log(`Find user error: ${err}`); return; } console.log(`Found user: ${user}`); });
其中,findOne()
方法用来查询满足条件的第一个文档,返回一个 Promise 或者执行回调函数,取决于是否传入回调函数。如果查询失败,将返回 err 错误。
投影查询
投影查询是指根据指定的字段对集合进行查询,可以使用 select()
方法指定需要查询的字段,也可以使用 exclude()
方法指定需要排除的字段。举个例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 查询用户名为 Alice 的用户的邮箱和创建时间字段 User.findOne({ username: 'Alice' }).select('email createdAt').exec((err, user) => { if (err) { console.log(`Find user error: ${err}`); return; } console.log(`Found user: ${user}`); });
其中,select()
方法指定需要查询的字段,用空格分隔多个字段名;exclude()
方法指定需要排除的字段,也用空格分隔多个字段名。
排序查询
排序查询是指根据指定的字段对集合进行排序,可以使用 sort()
方法指定排序条件,如:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 查询所有用户,并按照创建时间升序排列 User.find().sort('createdAt').exec((err, users) => { if (err) { console.log(`Find all users error: ${err}`); return; } console.log(`All users: ${users}`); });
其中,sort()
方法用来指定排序条件,如果要进行降序排序,可以在字段名前面加上 -
符号。
分页查询
分页查询是指对集合进行分页查询,可以使用 skip()
方法跳过指定数量的文档,再使用 limit()
方法限制查询结果的数量,如:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 查询第 1 页的 10 个用户 const page = 1; const pageSize = 10; User.find().skip((page - 1) * pageSize).limit(pageSize).exec((err, users) => { if (err) { console.log(`Find users error: ${err}`); return; } console.log(`Page ${page} users: ${users}`); });
其中,skip()
方法用来跳过指定数量的文档,limit()
方法用来限制查询结果的数量。
聚合查询
聚合查询是指对集合进行复杂的计算和处理,可以使用 aggregate()
方法实现,支持各种聚合操作符,如 $group
、$sort
、$project
、$match
、$lookup
等。举个例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 统计每个用户的评论总数,并按照评论总数降序排列 User.aggregate([ { $lookup: { from: 'comments', localField: '_id', foreignField: 'userId', as: 'comments' } }, { $project: { username: 1, commentCount: { $size: '$comments'} } }, { $sort: { commentCount: -1 } } ]).exec((err, users) => { if (err) { console.log(`Aggregate users error: ${err}`); return; } console.log(`Aggregate users: ${users}`); });
其中,$lookup
是用来关联集合的操作符,用来将 users
集合关联到 comments
集合上;$project
是用来投影字段的操作符,用来计算每个用户的评论总数;$sort
是用来排序的操作符,用来按照评论总数降序排列。
更新操作
更新操作是指对集合中的文档进行更新,可以使用 updateOne()
、updateMany()
、findOneAndUpdate()
、findByIdAndUpdate()
等方法进行更新。举个例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 将用户名为 Alice 的用户的邮箱更新为 alice@example.com User.updateOne({ username: 'Alice' }, { email: 'alice@example.com' }, (err, result) => { if (err) { console.log(`Update user error: ${err}`); return; } console.log(`Update result: ${result}`); });
其中,updateOne()
方法用来更新满足条件的第一个文档,updateMany()
方法用来更新满足条件的所有文档,findOneAndUpdate()
方法用来查询并更新满足条件的第一个文档,findByIdAndUpdate()
方法用来根据 ID 查询并更新对应的文档。
删除操作
删除操作是指对集合中的文档进行删除,可以使用 deleteOne()
、deleteMany()
、findOneAndDelete()
、findByIdAndDelete()
等方法进行删除。举个例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const User = require('./models/User'); // 删除创建时间早于 2021 年的所有用户 User.deleteMany({ createdAt: { $lt: new Date('2021-01-01') } }, (err, result) => { if (err) { console.log(`Delete users error: ${err}`); return; } console.log(`Delete result: ${result}`); });
其中,deleteOne()
方法用来删除满足条件的第一个文档,deleteMany()
方法用来删除满足条件的所有文档,findOneAndDelete()
方法用来查询并删除满足条件的第一个文档,findByIdAndDelete()
方法用来根据 ID 查询并删除对应的文档。
总结
本文介绍了 Mongoose 的基础操作,包括连接、模型定义、查询、更新、删除等。Mongoose 提供了丰富的查询操作,支持条件查询、投影查询、排序查询、分页查询、聚合查询等,可以满足各种复杂的需求。同时,Mongoose 还提供了简单易用的更新和删除方法,方便开发者对数据进行操作。对于 MongoDB 数据库的使用者来说,掌握 Mongoose 的基础操作是非常必要的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6534a6c07d4982a6eb99de63