mongoose的增删改查及模块化

mongoose的增删改查及模块化

九月 07, 2018

一、mongoose的增删改查

下面的例子展示了 mongoose 操作 MongoDB 实现增删改查的操作,要注意的是删和改要先获取’_id’

1
2
3
4
5
6
7
8
var u=new User({ //实例化model,增加数据

name:'Tom',
age:20,
status:1
})

u.save();
1
2
3
4
5
6
7
8
User.deleteOne({ '_id': '5b72ada84e284f0acc8d318a' }, function (err) {

if (err) {
console.log(err);
return;
}
console.log('删除成功');
})
1
2
3
4
5
6
7
8
User.updateOne({ '_id': '5b72ada84e284f0acc8d318a' }, { name: 'Ben' }, function(err) {

if(err){
console.log(err);
return;
}
console.log('修改成功')
})
1
2
3
4
5
6
7
8
User.find({},function(err,docs){ //未限定条件即为全部查找

if(err){
console.log(err);
return;
}
console.log(docs);
})

二、mongoose的模块化

进行模块化可以达到提高运行效率、精简代码的功效。首先我们在项目里新建一个 model 文件夹,将需要的模块放进去,这里举两个例子:

  1. 在 model 文件夹里新建一个 db.js,封装连接数据库的模块。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var mongoose=require('mongoose'); //引入的mongoose是工具

    mongoose.connect('mongodb://127.0.0.1:27017/test',{ useNewUrlParser: true },function(err){

    if(err){
    console.log(err);
    return;
    }
    console.log('数据库连接成功')
    });

    module.exports=mongoose; //暴露的mongoose是我们定义的模块
  2. 在 model 文件夹里新建一个 user.js,封装用户模块,此为操作 user 表的模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var mongoose=require('./db.js'); //首先引入我们刚封装的db模块

    var UserSchema=mongoose.Schema({ //然后定义Schema

    name:String,
    age:Number,
    status:{

    type:Number,
    default:1
    }
    })

    module.exports=mongoose.model('User',UserSchema,'user'); //最后定义UserModel并暴露出去,这里用了简写

在封装完以上两个模块之后,我们就可以在外部进行调用了,例如在外部的 app.js 里我们可以这样增加并查找数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var UserModel=require('./model/user.js');

var user=new UserModel({ //增

name:"Tom",
age:20
})

user.save(function(err){ //存

if(err){
console.log(err);
return;
}
UserModel.find({},function(err,docs){ //找

if(err){
console.log(err);
return;
}
console.log(docs);
})
})

三、解惑

Q:“我们注意到每封装一个新模块都要调用一次 db.js,那么会不会使 MongoDB 多次重连而导致性能变差?”
A:并不会,因为 mongoose 底层用到了单例模式,所以数据库只会连接一次,连接之后其余模块的运行时间会大大缩短,从而保证了性能。