一.Mongoose的介绍
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具.
在项目安装mongoose封装 :cnpm install mongoose --save
二.Mongoose常用语法
1.加载Mongoose模块
var mongoose = require('mongoose');
2.连接数据库
(1).connect()
mongoose.connect(uri(s), [options], [options.useMongoClient], [callback])
//引用mongoose
const mongoose = require('mongoose')
const URL = 'mongodb://localhost:27017/shop';
mongoose.connect(URL,function(err){
if(err){
console.log('数据库连接失败:'+err);
}else {
console.log('数据库成功连接到:'+ URL);
}
});
shop是数据库的集合 (这个项目的的数据库名)
(2).createConnection()
此方法获取数据库连接,操作database层面,返回一个Connection对象。Connection对象中包含model,collection,dropDatabase等操作数据库的方法,也包含connected,disconnected,error等事件触发方法。
const mongoose = require('mongoose')
const URL = 'mongodb://localhost:27017/shop';
//实际上只是创建了一个Connection对象,能够操作数据库,但是不能操作具体的document
var db = mongoose.createConnection(URL);
db.on('connected',function(err){
if(err){
console.log('连接数据库失败:'+err);
}else{
console.log('连接数据库成功!');
}
})
(3).connection
connection是mongoose模块的默认引用,返回一个Connetion对象点击打开链接。因为connect()方法并不能监听数据库连接情况,所以,一般情况下此方法跟connet()方法搭配使用:
const mongoose = require('mongoose')
const URL = 'mongodb://localhost:27017/shop';
mongoose.connect(URL);
var db = mongoose.connection;//获取connection实例
//使用Connetion监听连接状态
db.on('connected',function(err){
if(err){
console.log('连接数据库失败:'+err);
}else{
console.log('连接数据库成功!');
}
});
参考:mongoose中connect()、createConnection()和connection的区别和作用
3.数据连接成功 定义Schema表模型
比如goods商品表
var produtSchema = new Schema({
"productId":String,//定义一个字段productId,类型为String
"productName":String,
"prodcutPrice":Number,
"prodcutImg":String
});
或是
var produtSchema = new Schema({
"productId":{type: String, 'require': true},
"productName":{type: String, 'require': false},
"prodcutPrice":{type: Number, 'require': false},
"prodcutImg":{type: String, 'require':false},
});
//通过mongoose的model把goods模块输出 //good表名 它会自动找到good并加s
类型:String Number Date Buffer Boolean Mixed Objectid Array index :建索引 default:默认值
4.常用数据库操作
(1).查找数据find()
a.这是查找所有数据
查询mongoDB的goods数据
var Goods = require('../models/goods');
Goods.find({},function(err,doc){
if(err){
res.json({
status:'1',
msg:err.message
})
}else{
res.json({
status:'0',
msg:'',
result:{
count:doc.length,
list:doc
}
})
}
})
b.按分页查找以及排序
查询mongoDB的goods数据
var Goods = require('../models/goods');
let currentPage = parseInt(req.param("page"));//当前是第几页
let pageSize = parseInt(req.param("pageSize"));//一页多少数据
let sort = req.param("sort");//排序
let skipNum = (currentPage-1)* pageSize;//跳过几条数据
let params = {};
let goodsModel = Goods.find(params).skip(skipNum).limit(pageSize).sort({'prodcutPrice':1});//find()查找数据
goodsModel.exec(function(err,doc){
if(err){
res.json({
status:'1',
msg:err.message
})
}else{
res.json({
status:'0',
msg:'',
result:{
count:doc.length,
list:doc
}
})
}
})
c.按照id查找
查询mongoDB的goods数据
var Goods = require('../models/goods');
var id = '5b20bee91e440d036027d320';
Goods.findById(id, function(err,doc){
if(err){
res.json({
status:'1',
msg:err.message
})
}else{
res.json({
status:'0',
msg:'',
result:{
count:doc.length,
list:doc
}
})
}
})
d.模糊查找 产品名字带6的
查询mongoDB的goods数据
var Goods = require('../models/goods');
var whereStr = {'productName':{$regex:/6/i}};
Goods.find(whereStr, function(err,doc){
if(err){
res.json({
status:'1',
msg:err.message
})
}else{
res.json({
status:'0',
msg:'',
result:{
count:doc.length,
list:doc
}
})
}
})
(2).增加数据
a.方式通过mongobooster可视化工具执行语句
db.goods.insert({"productId":"10001","productName":"小米6","prodcutPrice":2499,"prodcutImg":"mi6.jpg"})
b.express框架的router/goods.js
var Goods = require('../models/goods');
let mo = new Goods({
"productId":"10011",
"productName":"小米11",
"prodcutPrice":4000,
"prodcutImg":"10.jpg"
});
mo.save({}, (err, doc)=> {
if (err) {
console.log(err);
}else {
console.log(doc);
}
});
c.用mongose的语法创建
//类似于mysql的表,mongo里面表结构,字段的创建(user表名,Schema里面是字段)
const User = mongoose.model('user',new mongoose.Schema({
username:{type:String,require:true},
nickname:{type:String,require:false},
age:{type:Number,require:true}
}))
//新增数据
User.create({
username:'小高',
nickname:'nini',
age:20
},function(err,doc){
if(!err){
console.log(doc)
}else{
console.log(err)
}
})
(3).修改/更新 数据
a.findByIdAndUpdate,这种比较有指定性,就是根据_id
var Goods = require('../models/goods');
var id = '5b20c5296bfe282a48380f3e';
var updatestr = {'productName': '原名小米11搞成小米6'};
Goods.findByIdAndUpdate(id, updatestr, function(err, res){
if (err) {
console.log("Error");
}
else {
console.log("修改成功");
}
})
b.update()修改方法
var Goods = require('../models/goods');
var wherestr = {'productName' : '原名小米11搞成小米6'};
var updatestr = {'prodcutPrice':5674};
Goods.update(wherestr, updatestr, function(err, res){
if (err) {
console.log("Error");
}
else {
console.log("修改成功");
}
})
User.update({条件},{'$set':{修改的内容}},function(err,doc){})
User.update({'username':'小高'},{'$set':{age:25}},function(err,doc){
if(!err){
console.log(doc)
}
})
//找到username为小高的人,修改年龄为25
更新子文档 $:代表数组的下标,例如只更新cartList数组中满足条件的元素
router.post("/carEdit",function(req,res,next){
var userId = req.cookies.userId;
var productId = req.body.productId;
var productNum = req.body.productNum;
var checked = req.body.checked;
User.update({
//这个是查询的条件
userId:userId,
"cartList.productId":productId
},{//更新子文档 $:代表数组的下标,例如只更新cartList数组中满足条件的元素
"cartList.$.productNum":productNum,
"cartList.$.checked":checked
},function(err,doc){
if(err){
res.json({
status:"1",
msg:err.message
})
}else{
if(doc){
res.json({
status:"0",
msg:"",
result:'更新成功'
})
}
}
})
})
其它更新方法
Model.findOneAndUpdate([conditions], [update], [options], [callback]) //找到一条记录并更新
(4).删除数据
var Goods = require('../models/goods');
var wherestr = {'productName' : '原名小米11搞成小米6'};
Goods.remove(wherestr,function(err, res){
if (err) {
console.log("Error");
}
else {
console.log("删除成功");
}
})
User.update({//这个是查询的条件},{ $pull:删除指定数据,例如对指定userId下的cartList数组删除其中指定的productId
$pull:{'cartList':{'productId':productId}}}
//购物车删除
router.post("/carDel",function(req,res,next){
var userId = req.cookies.userId;
var productId = req.body.productId;
User.update({
//这个是查询的条件
userId:userId
},{//删除条件 $pull:删除指定数据,例如对指定userId下的cartList数组删除其中指定的productId的元素
$pull:{
'cartList':{
'productId':productId
}
}
},function(err,doc){
if(err){
res.json({
status:"1",
msg:err.message
})
}else{
if(doc){
res.json({
status:"0",
msg:"",
result:'删除成功'
})
}
}
})
})
其它常用方法还有:
Model.findByIdAndRemove(id, [options], [callback])
Model.findOneAndRemove(conditions, [options], [callback])