Mongoose简介及其使用方法
在学习中大部分都是通过MongoDB的shell来完成对数据库的各种操作的,而在实际的开发中如果继续采用这种方式是比较低效率的,所以我们需要通过其他语言来操作MongoDB,在前端中一般使用Node.js来操作MongoDB,而Mongoose就是一个让我们通过Node来操作MongodDB的模块
一、Mongoose
- Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块(Node中原生的用来操作MongoDB的模块)进行了进一步的优化封装,并提供了更多的功能,在大多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处。
- ODM中的O指的是JS对象,D指的是数据库中的文档,M的意思是将MongoDB数据库中文档对象映射成JS中的对象,这样通过对JS对象的操作就可以操作数据库了。
1、Mongoose的好处
- 可以为文档创建一个模式结构(Schema)
???????模式结构就是一个对文档的约束,用来限制文档字段的个数、类型和字段值等 - 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换转化为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
2、Mongoose提供的新的对象
???????Schema对象、Model对象、Document对象的创建具有先后顺序,先创建Schema对象,用来约束Model对象,然后再创建Model对象作为Document的容器,最后再创建Document对象
3、Mongoose的使用步骤
- 下载安装Mongoose模块
命令:npm i mongoose - 在项目中引入Mongoose模块
var mongoose = require(“mongoose”); - 连接Mongoose数据库
mongoose.connect(“mongodb://数据库的ip地址:端口号/数据库名”,{useMongoClient:true}); 如果端口号是默认端口号27017则可以省略不写 - 监听MongoDB数据库的连接状态
在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接,通过监视该对象,可以监听数据库服务器和客户端的连接与断开 数据库连接成功时执行回调函数 mongoose.connection.once(“open”,function(){ }); 数据库断开时执行回调函数 mongoose.connection.once(“close”,function(){ }); - 断开数据库连接(该步骤一般不需要)
mongoose.disconnect();
???????mongoose模块的使用步骤中只有步骤1和2是必须的,其他的步骤可有可无。而且MongoDB数据库一般情况下只需要连接一次,连接一次以后,除非项目停止,服务器关闭,否则连接一般不会断开。
二、Mongoose操作数据库的方法
(详细的使用步骤可以查询:mongoose.com网站中的文档手册)
1、创建Schema对象
- 将 mongoose.schema 赋值给一个变量,可以简化操作
var Schema = mongoose.schema; - 创建Schema(模式)对象
var stuSchema = new Schema({ name:String, age:Number, gender:{ type:String, default:“female” }, address:String });
????????创建好了Schema对象意味着已经创建好了数据库,规定好的数据库中存储的集合的样式,接下来就是创建集合了
2、创建Model对象
???????? Model代表数据库中的集合,通过Model才能对数据库进行操作,使用mongoose.model(modelNmae,schema)可以创建一个Model对象,Model就是数据库中集合的映射,所以modelName就是指数据库中其对应的那个集合的名字,mongoose会自动将集合名变成复数;schema指的是第一步中创建的对模型进行约束的schema对象名. ????????????????var StuModel = mongoose.model(“student”,stuSchema);
3、向集合中插入一个文档Document
????????mongoose中的文档对象是数据库中文档对象的一个映射,创建好了文档对象,其对应的数据库和集合也将被自动建立。通过以下语句可以实现Document对象的创建: ????????????????Model对象名.create(doc,function(err){ ????????????????????????if(!err){
????????????????????????} ????????????????}); ????????其中doc是我们要创建的文档对象,当创建成功后,其后的回调函数会执行
二、Model的方法
有了model就可以使用mongoose模块对数据库进行CRUD操作了。
1. Model.create(doc(s),[callback]) ? ? ?作用:该函数用来创建一个或多个文档并添加到数据库中 ? ? ?参数:doc(s)可以是一个文档对象,也可以是一个文档对象的数组;[callback]回调函数是可选的,如果传入了回调函数,则当文档创建成功后会执行该函数 2. Model.find(conditions,[projection],[options],[callback]) ? ? ?作用:该函数用来查询所有符合条件的所有文档,返回一个文档数组
? ? ?Model.findById(id,[projection],[options],[callback]) ? ? ?作用:该函数用来根据文档的id属性值查询文档,返回一个文档对象
? ? ?Model.findOne(conditions,[projection],[options],[callback]) ? ? ?作用:该函数用来查询符合条件的第一个文档,返回第一个符合条件的文档对象 ? ? ?参数: ? ? ?? ? ?? ? ?conditions–查询对象, ? ? ?? ? ?? ? ?projection—投影对象,用于获取想要显示的字段,投影对象有两种定义方式:{字段名:值,字段名:值,…};”字段名1 字段名2 …“,该种定义方式,若不想显示_id字段,只需要在id字段前加入-,即”-_id“ ? ? ?? ? ?? ? ?options–查询选项(skip,limit等) ? ? ?? ? ?? ? ?callback–回调函数,查询结果会通过回调函数返回,所以回调函数是必须传入的,回调函数中有两个参数,一个是err,一个是doc(s),doc(s)中存储了查询到的文档。 ? ? ?? ? ?? ? ?其他用[]括起来的参数可以不传入 3. Model.update(conditions,doc,[options],[callback]) ? ? ?作用:该函数用来修改所有符合条件的一个或多个文档,返回一个文档数组
? ? ?Model.updateMany(id,doc,[options],[callback]) ? ? ?作用:该函数用来修改符合条件的所有文档
? ? ?Model.updateOne(conditions,doc,[options],[callback]) ? ? ?作用:该函数用来修改符合条件的第一个文档 ? ? ?参数: ? ? ?? ? ?? ? ?conditions–查询对象, ? ? ?? ? ?? ? ?doc—修改后的对象 ? ? ?? ? ?? ? ?options–配置对象 ? ? ?? ? ?? ? ?callback–回调函数 4. Model.remove(conditions,[callback]) ? ? ?作用:该函数用来删除符合条件的一个或多个文档
? ? ?Model.deleteOne(conditions,[callback]) ? ? ?作用:该函数用来删除符合条件的第一个文档
? ? ?Model.deleteMany(conditions,[callback]) ? ? ?作用:该函数用来删除符合条件的所有文档 5. Model.count(条件对象,function(err,count){}) ? ? ?作用:该函数用来统计符合条件的文档数目
二、Document的方法
? ? ??通过Model.查询到的结果就是mongoose中新添加的Dcument文档对象,它是Model的一个实例对象。通过instanceof运算符可以检查出Document是Model的实例。Document和MongoDB数据库集合中的文档是一一对应的。
|