Mongoose简介
简介
- 之前我们都是通过shell来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作
- 而Mongoose就是一个让我们可以通过Node来操作MongoDB的模块
- Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能
- 在大多数情况下,它被用来吧结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处
Mongoose的好处
- 可以为文档创建一个模式结构(Schema)
- 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
新的对象概念
mongoose中为我们提供了几个新的对象
- Schema(模式对象)
- Schema对象定义约束了数据库中的文档结构
- Model
- Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
- Document
- Document表示集合中的具体文档,相当于集合中的一个具体的文档
基本使用
/**
* 1. 下载安装 Mongoose
* npm i mongoose --save
* 2. 在项目中引入mongoose
* var mongoose = require("mongoose")
* 3. 连接MongoDB数据库
* mongoose.connect('mongodb://localhost/test');
* mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名');
* - 如果端口号是默认的端口号(27017) 则可以省略不写
* 4. 断开数据库连接(一般不需要调用)
* mongoose.disconnect()
*
*
* 5. 监听MongoDB数据库的连接状态
* - 在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
* 通过监视该对象的状态,可以来监听数据库的连接和断开
*
* mongoose.connection.once("open",function(){}); // 数据库连接成功事件
* mongoose.connection.once("close",function(){}) // 数据库断开的事件
*/
连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
mongoose.connection.once("open",function(){
console.log('数据库连接成功');
});
创建Schema对象
var Schema = mongoose.Schema;
// 创建Schema(模式)对象
var stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "female"
},
address: String
})
创建模型
// 通过Schema来创建Model
// Model代表的是数据库中的集合,通过Model才能对数据库进行操作
// mongoose.model(modelName,schema) (集合名,Schema)
// modelName 就是要映射的集合名,mongoose会自动将集合名变成复数
var StuSchema = mongoose.model("student",stuSchema)
// 向数据库中插入一个文档
// StuSchema.create(doc,function(){})
StuSchema.create({
name: "孙悟空",
age: 34,
gender: "male",
address: "花果山"
},function(err){
if(!err){
console.log("插入成功")
}
})
Model对象的常用方法
有了Model,我们就可以对数据库进行增删改查的操作了
插入数据
Model.create(doc(s),[callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
doc(s) 可以是一个文档对象,也可以是一个文档对象的数据
callback 当操作完成之后调用的回调函数
StuSchema.create([
{
name: "猪八戒",
age: 22,
gender: "male",
address: "高老庄"
},{
name: "唐僧",
age: 76,
gender: "male",
address: "女儿国"
}
],function(err){
if(!err){
console.log('数据插入成功'+arguments)
}
})
查询数据
Model.find(conditions,[projection],[options],[callback])
- 查询所有符合条件的文档, 总会返回一个数组
Model.findById(id,[projection],[options],[callback])
- 根据文档的id属性查询文档
Model.findOne([conditions],[projection],[options],[callback])
- 查询符合条件的第一个文档,总是返回一个具体的文档对象,可以.
conditions 查询条件
projection 投影 需要获取到的字段
- 两种方式
{name: 1, _id: 0}
"name -_id"
options 查询选项(skip limit)
{skip: 3, limit: 1}
callback 回调函数,查询结果会通过回调函数返回
回调函数必须传,如果不传回电函数,压根不会查询
# 查询出name,不包括_id的选项
StuSchema.find({name: '唐僧'},{name: 1, _id: 0},function(err,docs){
if(!err){
console.log(docs)
}
})
# 查询出name age,不包括_id的选项
StuSchema.find({name: '唐僧'},"name age -_id",function(err,docs){
if(!err){
console.log(docs)
}
})
# 跳跃2条,显示2条
StuSchema.find({name: '唐僧'},"name age -_id",{skip: 2, limit: 2},function(err,docs){
if(!err){
console.log(docs)
}
})
StuSchema.findOne({},function(err,doc){
if(!err){
console.log(doc.name)
}
})
StuSchema.findById("5b756524130fb82c541ff01b",function(err,doc){
if(!err){
console.log(doc)
# 通过find()查询的结果,返回的对象,就是Document,文档对象
# document对象是Model的实例
# console.log(doc instanceof StuModel)
}
})
修改数据
Model.update(conditions,[projection],[options],[callback])
Model.updateMany(conditions,doc,[options],[callback])
Model.updateOne(conditions,doc,[options],[callback])
- 用来修改一个或多个文档
- 参数
conditions 查询条件
doc 修改后的对象
options 配置参数
callback 回调函数
StuSchema.updateOne({name: "唐僧"},{$set: {age: 0}},function(err,docs){
if(!err){
console.log("修改成功")
}
})
删除数据:
Model.remove(conditions,[callback])
Model.deleteOne(conditions,[callback])
Model.deleteMany(conditions,[callback])
StuModel.remove({name: "白骨精"},function(err){
if(!err){
console.log("修改成功")
}
})
统计文档的数量
Model.count(conditions,[callback])
StuModel.count({},function(count){
if(!err){
console.log(count)
}
})
document的使用
插入:
var StuSchema = mongoose.model("student",stuSchema)
// 创建一个Document
var stu = new StuSchema({
name: "天霸",
age: 23,
gender: "male",
address: "碧波庭"
})
// document的方法:
// Model#save([options],[fn])
stu.save(function(err){
if(!err){
console.log("保存成功")
}
})
修改
StuSchema.findOne({},function(err,doc){
if(!err){
// update(update,[options],[callback])
// - 修改对象
// remove([callback])
// - 删除对象
// console.log(doc)
/* doc.update({$set: {age: 11}},function(err){
if(!err){
console.log("修改成功")
}
}) */
/* doc.age = 22;
doc.save(); */
/* doc.remove(function(err){
if(!err){
console.log("删除成功")
}
}) */
/*
get(name)
- 获取文档中的指定的属性值
set(name,value)
- 设置文档的指定的属性值
id
- 获取文档的_id的属性值
toJSON()
- 转换为一个JSON对象
toObject()
- 将document对象转换为一个普通的JS对象
- 所有的document对象的属性和方法都不能使用了
*/
// console.log(doc.get("age"))
// console.log(doc.age)
// doc.set("name","朱晓晓")
// doc.name = "hahah"
// console.log(doc._id)
// var doc = doc.toObject();
// delete doc.address 临时删除,并不会删除数据库中的数据
}
})