Mongoose
mongoose的好处
- 可以为文档创建一个模型结构
- 可以对模型中的对象/文档进行验证
- 数据可以用个类型zhu7anhuan转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
mongoose提供的新对象
-
schema对象定义约束了数据库中的文档结构
-
Model对象作为结合中的所有文档的表示,相当于MongoDB中的集合collection
-
Document对象表示结合中的具体文档,相当于集合中的一个集体的文档
mongoose的使用
/*
1.下载安装mongoose
npm i mongoose --save
2. 在项目中引入mongoose
var mongoose = require("mongoose");
3.链接MongoDB数据库
mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名',{useMongoClient:true}) ,端口号是默认端口号,27017,则可以省略不写
4. 断开数据库链接(一般不需要调用,只需要连接一次,除非项目停止服务器关闭)
mongoose.disconnect()
*/
var mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true})
mongoose.connection.once("open",function(){
console.log("连接成功")
})
mongoose.connection.once("close",function(){
console.log("断开成功")
})
//断开连接
mongoose.disconnect()
Schema
//
var Schema = mongoose.Schema//他是一个构造函数
var stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:"female"
//传对象可以设置默认的
},
address:String
});
Model
//Model代表数据库中的集合,通过model才能对数据库进行操作,插入的集合会变为复数加s
var StuModel = mongoose.model("student",stuSchema)
//向数据库中插入一个文档
StuModel.create({
name:"孙悟空",
age:18,
gender:"male",
address:"花果山"
},function(err){
if(!err){
console.log("插入成功")
}
})
//数据库中输入:db.students.find()即可查找
//有了model就可对数据库进行增删改查
//Model.create(doc(s),[callback])
//可以是一个或多个文档,回调函数不传也可
StuModel.create([
{
name:"zhubajie",
age:29
gender:"male",
address:"zzz"
},
{
name:"tangseng",
age:11,
gender:"male",
address:"xxx"
}
],function(err){
if(!err){
console.log("插入成功")
}
})
/*
Model.find(conditions,[projrction],[options],[callback])
查询所有符合条件的文档
conditions 查询的条件
projection 投影
options 查询选项(skip limit)
callback 回调函数,查询结果会通过回调函数返回,而且回调函数必须传,不传没有查询功能
*/
StuModel.find({name:"tangseng"},{name:1,_id:0},{skip:3,limit:1},function(err,docs){
//projection参数有两种方式,{"name age -id"}也可以这样写,表示只传入name age 不传入id
if{!err}{
console.log(docs)
console.log(docs[0].name)
}
})
//总会返回一个数组,没有查到返回一个空数组
StuModel.findById("xxxxxxxx",function(err,doc){
if(!err){
console.log(doc)
//通过find()查询的结果,返回的对象,就是document,文档对象
//document对象是model的实例
console.log(doc instanceof StuModel)//返回true
}
})
/*
修改,Model.update(conditions,doc,[options],[callback])
*/
//修改tangseng年龄为20
StuModel.update({name:"tangseng",{$set:{age:20}},function(){
if(!err){
console.log("成功")
}
}})
/*统计数量
length的话性能差,count性能好
*/
StuModel.count({},function(err,count){
if(!err){
console.log(count)
}
})
Document
//创建一个document
var stu = new StuModel({
name:"奔波霸",
age:48,
gender:"male",
address:"碧波潭"
//这里没有传到数据库
})
stu.save(function(err){
if(!err){
console.log("保存成功")
}
})
StuModel.findOne({},function(err,doc){
if(!err){
/*
console.log(doc)
doc.update({$set:{age:28},function(err){
if(!err){
console.log("成功")
}
}})
}
*/
/*
doc.age=18
doc.save()
*/
})
doc.remove(function(err){
if(!err){
console.log("再见")
}
})
//set 获取属性值
console.log(doc.get("name"))
//或是console.log(doc.age))
// 设置属性值
doc.set("name","朱小小")
//或是doc.name="hhh"
console.log(doc._id)
//toObject()
// 将document对象转换为一个普通的JS对象,转换为普通的js对象以后,注意所有的document对象的方法或属性都不能再操作数据库了
console.log(o)
doc=doc.toObject()
delete doc.address;
console.log(doc._id)
模块化思想:
-mongoose
--models
—student.js
--tools
—conn_mongo.js
—index.js
新建一个conn_mongo.js文件,定义一个模块,用来连接MongoDB数据库
var mongoose = require ("mongoose")
mongoose.connect ("monngodb://127.0.0.1/mongoose_test",{useMongoClient:true})
mongoose.connection.once("open",function(){
console.log("连接成功")
}
)
然后新建一个student.js文件,用来定义student的模型,定义model模型
var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var stuSchema = new Schema({
name:String,
age:Number;
gender:{
type:String,
default:"female"
},
address:String
})
//定义模型
var StuModel = mongoose.model("student",stuSchema)
module.exports = StuModel
新建一个index文件
require("./tools/conn_mongo")
var Student = require(./models/student)
Student.find({},function(err,docs){
if(!err){
console.log(docs)
}
})