Node.js通过Mongoose操作MongoDB数据库

        Mongoose是针对Node.js异步环境为MongoDB数据库提供的对象模型库。Mongoose基于官方的原生MongoDB驱动node- mongodb-native实现,封装了MongoDB数据的常用操作方法,使Node.js程序操作MongoDB数据库变得更加灵活简单。

一、名词解释

       Schema 它是一种以文件形式存储的数据库模型骨架,不具备对数据库操作的能力,仅仅只是数据库在程序片段中的一种表现,可以理解为表结构。

        Model 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对

        Entity  由Model创建的实体,他的操作也会影响数据库

二、Schema、Model、Entity的关系

       Schema生成ModelModel创造EntityModelEntity都可对数据库操作造成影响,但

ModelEntity更具操作性。

三、命名规范(建议)

       var StudentSchema;   //Student的文本属性

       var StudentModel;    //Student的数据库模型

       var StudentEntity;   //Student实体

四、实现增、删、改、查(CRUD)

      1、安装:

           npm install mongoose

      2、引用:

           var mongoose = require('mongoose');

     3、创建db.js文件用于连接MongoDB数据库

var mongoose = require('mongoose');
var DB_URL = 'mongodb://localhost:27017/mvc'; 

/** 链接 */
mongoose.connect(DB_URL,{useNewUrlParser:true,useUnifiedTopology:true });
/** 链接成功 */
mongoose.connection.on('connected',function() {
    console.log('Mongoose connection open to '+DB_URL);
})
/** 链接异常 */
mongoose.connection.on('error',function(err) {
    console.log('Mongoose connection error:'+err);
})
/** 链接断开 */
mongoose.connection.on('disconnectied',function() {
    console.log('Mongoose connection disconnected');
})
module.exports = mongoose;

        4、 创建UserSchema(user.js):

var mongoose = require('../../config/db.js');
var Schema = mongoose.Schema;

/** 定义User的Schema */
var UserSchema = new Schema({
    username: { type: String },
    password: { type: String },
    age: { type: Number }
});
/** model 是由schema生成的模型,具有对数据库操作的能力 */
module.exports = mongoose.model('User',UserSchema);

        5、插入数据(Model.save([fn])):

var liubei = new User({
    _id: 1001,
    username: '刘备',
    password: '111111',
    age:30
})
liubei.save(function(err,res) {
    if(err){
        console.log(err);
    }else{
        console.log(res);
    }
})

     6、更新数据(Model.updateOne(conditions, doc, [options], [callback]))

              conditions: 更新的条件,该值是一个对象。
              doc: 需要更新的内容,该值也是一个对象。
              options: 可选参数,它有如下属性:
                      safe :(布尔型)安全模式(默认为架构中设置的值(true)) 
                      upsert :(boolean)如果不匹配,是否创建文档(false) 
                      multi :(boolean)是否应该更新多个文档(false) 
                     runValidators:如果为true,则在此命令上运行更新验证程序。更新验证器根据模型的模式验证更新操作。 
                     strict:(布尔)覆盖strict此更新的选项 
                     overwrite: (布尔)禁用只更新模式,允许您覆盖文档(false)
     callback: 回调函数

var User = require('../schema/user.js');

/** 定义更新函数 */
function update() {
    //更新数据的条件
    let where_str = { 'username' : '曹操' };
    //更新的数据
    let update_str = { 'password' : 'abcdefg' };
    User.updateOne(where_str,update_str,function(err,res) {
        if(err){
            console.log(err);
        }else{
            console.log(res);
        }
    })
}
update()  //调用更新函数

        7、更新并返回数据:返回更新前的数据

            (Model.findOneAndUpdate([(conditions, doc, [options], [callback])])

  • conditions 第一个参数是一个对象参数,是用于查询与之相匹配的数据用的
  • doc 第二个参数也是一个对象参数,用于修改查询到的数据中的某条信息
  • options 第三个参数也是一个对象参数,主要用于设定匹配数据与更新数据的一些规定,比较复杂,一般用不到
  • callback 第四个参数也就是我们最熟悉的回调函数,函数默认传入两个参数,err、data。当数据库发生错误的时候传回一个err,若数据库正常,err为空;当正常根据第一个参数查询到相关数据并成功修改了我们设定的数据,data返回修改前的数据信息,若根据第一个参数没有查询到相关数据,data为null
/**
 * 第一个参数conditions,用于给定查询我们数据库中name为香蕉的数据
   第二个参数doc, set中设置了要更新的字段
   第三个参数options,因为简单使用没用到,就只给了个空对象
   第四个参数callback,

   if(err) 是用于判断数据库是否发生错误,若数据库没发生错误,err为空,执行下一条语句;
           若数据库发生错误,err为错误对象,不为空,执行该条语句,打印' 数据库发生错误 '
   if(!data)用于判断是否正确查找到与我们第一个参数匹配的相关数据,若没查找到,data为null,!data不为空,执行该条语句,打印' 未查找到相关数据 ' 和一个 null;若查找到了,data为查找到的数据,!data为空,执行下条语句
   if(data)用于处理与if(!data)相反的操作,查询到相关数据,则data不为空,执行该条语句,
           打印 ' 修改数据成功 ' 和 我们查询到的该条数据信息;
 */
User.findOneAndUpdate({
    username: '刘备'
},{
    $set: {
        password: 'aaaaaaaaaa'
    }
},{},function(err,data){
    if(err){
        console.log("数据库错误!");
    }
    else if(!data) {
        console.log("未找到数据!");
        console.log(data);
    }
    else if(data) {
        console.log("数据更新成功!");
        console.log(data);
    }
})

       8、查询

var User = require('../schema/user.js');

//查询所有
User.find(function(err,data) {
    if(err){
        console.log(err)
    }else{
        console.log(data);
    }
})
//按id查询
User.findById({
    _id : '6077ec65465e955a83fc0457'
},function(err,data) {
    if(err){
        console.log(err)
    }else{
        console.log(data);
    }
})
//多条件查询
User.findOne({
    username: '诸葛亮',
    age: 26
},function(err,data) {
    if(err){
        console.log(err)
    }else{
        console.log(data);
    }
})
//记录数查询
User.count(function(err,data) {
    if(err){
        console.log(err)
    }else{
        console.log("记录数:"+data);
    }
})

五、和Express框架结合

     1、创建配置文件(db.js):

var mongoose = require('mongoose');
var DB_URL = 'mongodb://localhost:27017/mvc'; 

/** 链接 */
mongoose.connect(DB_URL,{useNewUrlParser:true,useUnifiedTopology:true });
/** 链接成功 */
mongoose.connection.on('connected',function() {
    console.log('Mongoose connection open to '+DB_URL);
})
/** 链接异常 */
mongoose.connection.on('error',function(err) {
    console.log('Mongoose connection error:'+err);
})
/** 链接断开 */
mongoose.connection.on('disconnectied',function() {
    console.log('Mongoose connection disconnected');
})
module.exports = mongoose;

       2、创建Schema(UserSchema.js),并生成模型

var mongoose = require('../../config/db.js');
var Schema = mongoose.Schema;

/** 定义User的Schema */
var UserSchema = new Schema({
    username: { type: String },
    password: { type: String },
    age: { type: Number }
});
/** model 是由schema生成的模型,具有对数据库操作的能力 */
module.exports = mongoose.model('User',UserSchema);

       3、创建路由文件:

var express = require('express');
var router = express.Router();
var User = require('../mongoose/schema/user.js'); //导入User模型
/** 
 * 插入记录:http://localhost:3000/api/add 
 */
router.post('/add',async(req,res) => {
    let user = new User({
        username: req.body.username,
        password: req.body.password,
        age: req.body.age
    });
    user.save(await function(err,data){
        if(err){
           res.json({
               code: 1000,
               msg: '插入数据失败!',
           }) 
        }else{
            res.json({
                code: 200,
                msg: 'success',
                data: data       
            })
        }
    })
})

/**
 * 查询记录:http://localhost:3000/api/find
 */
router.get('/find',async(req,res)=> {
    User.find(await function(err,data) {
        if(err){
            res.json({
                code: 1000,
                msg: '查询失败!',
            }) 
         }else{
             res.json({
                 code: 200,
                 msg: '查询成功!',
                 data: data       
             })
         }
    })
})
module.exports = router ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上庸者-不服周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值