Node.js中Mongoose的使用方法

Mongoose是在node.js环境中对MongoDB数据库操作的封装,一种对象模型工具,可以将数据库中的数据转换为javascript对象供我们使用。

一、名词解释

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

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

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

二、Schema、Model、Entity的关系

Schema生成ModelModel创造EntityModelEntity都可对数据库操作造成影响,但ModelEntity更具操作性。

三、命名规范(建议)

var PersonSchema;   //Person的文本属性

    var PersonModel;    //Person的数据库模型

var PersonEntity;   //Person实体

四、实现增删改查(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);

 

 2、创建路由文件:

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 ;

 

原文地址:https://www.cnblogs.com/lone5wolf/p/14865446.html