Mongoose入门
01 mongoose的好处
- 可以为文档创建一个模式结构 (Schema)
- 可以对模型种的对象/文档进行验证
- 数据可以通过类型转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
02 mongoose中的新对象
- Schema(模式对象)
- Schema对象定义约束了数据库中的文档结构
- Model
- Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
- Document
- Document表示集合中的具体文档,相当于集合中的一个具体的文档
03实例
/*
1.下载安装mongoose
npm i mongoose --save
2.引入数据库
var mongoose = require("mongoose");
3.连接数据库
mongoose.connect("mongodb://localhost/test",{useMongoClient:true});
mongoose.connect("mongodb://数据库的ip:端口号/数据库名",{useMongoClient:true})
新版中{useMongoClient:true}不用再写了
端口号默认是27017则可以省略
4.监听数据库连接状态
在mongoose对象中,有一个属性是connection,该对象表示的就是数据库连接
通过监视该对象的状态,可以来监听数据库的连接与断开
数据库连接成功的事件
mongoose.connection.once("open",fn);
数据库断开的事件
mongoose.connection.once("close",fn);
5.断开数据库连接
mongoose.disconnect();
*/
04 Schema
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/test",{useMongoClient:true});
mongoose.connection.once("open",function(){
console.log("数据库连接成功!");
})
//创建约束模式
//将mongooose.Schema赋值给一个变量
var Schema = mongoose.Schema;
//创建Schema(模式)对象
var stuSchema = new Schema({
name:String;
age:Number;
gender:{
type:String,
default:"female"
},
address:String;
})
//创建model,代指集合
//通过Schema来创建Model
// Model代表的是数据库中的集合,通过Model才能对数据库进行操作
// mongoose.model(modelName,Schema)
// modelName 就是要映射的集合名
var stuModel = mongoose.model("students",stuSchema);
//创建文档
// stuModel.create(doc,fn(err){})
stuModel.create({
name:"胡志武",
age:21,
address:"广州"
},function(err){
if(!err){
console.log("创建文档成功")
}
})
05 Model
有了Model,我们就可以来对数据库进行增删改查的操作了
Model.create(doc(s),[callback])
- 用来创建一个文档或多个文档并添加到数据库中
- 参数
- doc(s)可以是一个文档对象,也可以是一个文档对象的数组
- callback
查询
-
Model.find(conditions,[projection],[options],[callback])
- 查询符合条件的文档
- 总会返回一个数组
-
Model.findOne([conditions],[projection],[options],[callback])
- 查询符合条件的第一个文档
- 返回第一个具体的文档对象
-
Model.findById(id,[projection],[options],[callback])
- 根据文档的id属性查询文档
conditions 查询的条件
projection 投影 需要获取的字段,
- 两种方式:
- {name:1,id:0}
- "name -id"
options 查询选项(skip limit)
callback 回调函数,查询结果会通过回调函数返回
stuModel.find({name:"胡志武"},function(err,docs){
if(!err){
console.log(docs);
}
})
stuModel.find({},"name -id",function(err,docs){
if(!err){
console.log(docs);
}
})
stuModel.find({},"name -id",{skip:3},function(err,docs){
if(!err){
console.log(docs);
}
})
修改
Model.update(conditions,doc,[options],[callback])
Model.updateOne(conditions,doc,[options],[callback])
Model.updateMany(conditions,doc,[options],[callback])
- 用来修改一个或多个文档
- 参数
- conditions 查询条件
- doc 修改后的对象
- options 配置参数
- callback 回调函数
stuModel.update({name:"胡志武"},{$set:{age:20}},function(err){
if(!err){
console.log("修改成功");
}
})
删除
Model.remove(conditions,[callback]);
Model.deleteOne(conditions,[callback]);
Model.delete(conditions,[callback]);
Model.remove({name:"胡志武"},function(err){
console.log("删除成功!");
})
文档的数量
Model.count(conditions,[callback])
stuModel.count({age:18},function(err,count){
console.log(count);
})
06 Document
Document 和 集合中的文档一一对应,Document是Model的实例
通过Model查询到结果都是Document
创建一个Document
var stu = new StuModel({
name:"奔波霸",
age:48,
gender:"male",
address"碧波谭"
})
// 此时还没有插入数据库中
/*
document的方法
Model#save([option],[callback])
*/
stu.save(function(err){
console.log("保存成功")
})
/*
doc.update(update,[options],[callback] )
- 修改对象
doc.remove([callback])
- 删除文档
doc.get(name)===doc[name]
doc.set(name,value)===doc[name]=value
doc._id
doc.toObject 转化为JS对象
转化为js对象才能删除其中一个属性
但转化后document的方法都不能使用了
*/
07 Mongoose关联表的操作
分两步走:
1.建立约束模型式,指定关联字段
var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var article = new Schema({
//关联字段 - 内容分类的id
category: {
//类型
type: mongoose.Schema.Types.ObjectId,
//引用
ref: 'Category'//数据库中集合的名字
},
})
ref表示要关联的集合名字,type表示通过ObjectId关联该集合
2.关联查询表时,使用populate
Query.populate(path, [select], [model], [match],[options])
path:你要查询的集合名
model:类型Model,指定要关联字段的model,没有指定的话,就会使用ref指定的
match:查询条件
options:查询参数,如limit,skip等
实例
content.findOne()
.populate({path:['user','catagory']})
.exec(function(err,data){
})
08Mongoose支持Promise,避免回调地狱
content.find()
.count()
.then(function(data){
return content.find().skip(data/2).limit(10)
}).then(function(data){
console.log(data)
})
结语
如有错漏处,还请看官们多多指正,如果觉得这篇文章对你有帮助的话,欢迎点赞分享!
如果要转载,请注明出处
本文作者:胡志武
时间:2019/5/29