Mongoose学习

一.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 
            }
        })
    }
 
})

Mongoose学习

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
            }
        })
    }
})

Mongoose学习

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
            }
        })
    }
})

Mongoose学习

(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);
    }
});

Mongoose学习

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("修改成功");
    }
})

Mongoose学习

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("修改成功");
    }
})

Mongoose学习
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])

上一篇:javascript – jest mockgoose – 在测试运行完成后,jest没有退出一秒钟


下一篇:javascript – 不能将.push()子文件转换成Mongoose数组