nodejs结合Mongodb,实现数据库的增删改查

  • 1.安装mongoose
  • 2.连接数据库
  • 2.1 确保数据库连接池是已打开状态(准备工作)
  • 2.2 新建一个db.js文件,准备连接数据库
  • 2.3 生成自定义模块
  • 3. 设计用户数据表
  • 4. 增删改查操作
  • 4.1 增
  • 4.2 删
  • 4.3 改
  • 4.4 查
  • 5. 封装数据库模块
  • 5.1 目录结构
  • 5.2 封装数据库增删改查
  • 5.3 测试数据库的增删改查


1.安装mongoose

首先安装mongoose插件,在控制台输入如下命令。

cnpm i mongoose -S
-S --save
-D --save-dev

2.连接数据库

2.1 确保数据库连接池是已打开状态(准备工作)

D盘mongodb文件夹内解压下载好的mongodb文件,D盘根目录下创建一个文件夹data,在data内部再创建一个文件夹db
进入mongodbbin目录,按住Shift键,空白处再点击鼠标右键,打开命令行窗口,输入下面的指令。

mongod --dbpath d:\data\db

2.2 新建一个db.js文件,准备连接数据库

const mongoose = require('mongoose'); 
const DB_URL = 'mongodb://127.0.0.1:27017/sh1902'; 

mongoose.connect(DB_URL, { useNewUrlParser: true });
mongoose.connection.on('connected', () => { 
 	 console.log('数据库已经连接成功'); 
}); 
mongoose.connection.on('disconnected', () => {
	 console.log('数据库连接失败'); 
 }); 
 mongoose.connection.on('error', () => {
 	 console.log('数据库连接异常'); 
 });

在控制台输入node db.js指令,应出现“数据库连接成功”的字样。

2.3 生成自定义模块

依据模块化开发,需要将db.js连接数据库的文件暴露出去,生成一个自定义模块。

const mongoose = require('mongoose'); 
const DB_URL = 'mongodb://127.0.0.1:27017/sh1902'; 

mongoose.connect(DB_URL, { useNewUrlParser: true }); 
mongoose.connection.on('connected', () => { 
	console.log('数据库已经连接成功'); 
}); 
mongoose.connection.on('disconnected', () => { 
	console.log('数据库连接失败'); 
}); 
mongoose.connection.on('error', () => { 
	console.log('数据库连接异常'); 
}); 
module.exports = mongoose;

3. 设计用户数据表

设计数据表的形式,暴露数据模型,并在数据库中创建一个集合。
创建一个名为user.js的文件。

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

const UserSchema = new Schema({ 
	username: { type: String }, 
	password: { type: String }, 
	age: { type: Number }, 
	tel: { type: String }, 
	sex: { type: String }, 
	city: { type: String } 
}); 
// 执行时 会在数据库中创建users集合 
module.exports = mongoose.model('User', UserSchema);

注意

module.exports = mongoose.model('User', UserSchema);

其中的User为自定义名称,数据库中会出现其复数的集合。例如:

module.exports = mongoose.model(‘Test’, UserSchema);

此时,数据库会出现tests的集合。

4. 增删改查操作

4.1 增

新建insert.js用来添加新用户

// 插入用户 
const User = require('./users'); 
const user = new User({ 
	username: '李思思', 
	password: '123', 
	age: 22, 
	tel: '13248099856', 
	sex: '女', 
	city: '山西' 
}) 
user.save((err) => { 
	if (err) throw err; 
	console.log('用户插入成功') 
})

4.2 删

新建一个delete.js文件

const User = require('./users'); 
//第一种写法
// User.deleteOne({username: '李思思'}, err => { 
	// if (err) throw err; 
	// console.log('删除成功') 
// }) 
// style.display = 'flex' <==> style['display'] = 'flex' 
//第二种写法
User['deleteOne']({username: '李思思'}, err => { 
	if (err) throw err; 
	console.log('删除成功') 
})

4.3 改

新建update.js用来修改数据

const User = require('./users'); 
User.updateOne({username: '李思思'}, {$set: {age: 20}}, err => { 
	if (err) throw err; 
	console.log('修改成功') 
}) 
User.updateMany({}, {$set: {city:'江苏'}}, err => { 
	if (err) throw err; 
	console.log('修改成功') 
})

4.4 查

新建find.js用来测试增删改相关文件的功能,也可以用来查询数据库。

const User = require('./users'); 
User.find({}, {}, (err, data) => { 
	if (err) throw err 
	console.log(data) 
})

另一种查询数据库的写法,可添加排序功能。(推荐)

const User = require('./users'); 
User.find({}, {_id: 0, __v: 0}).sort({age: 1}).exec((err, data) => { 
	if (err) throw err; 
	console.log(data) 
})

5. 封装数据库模块

5.1 目录结构

sql
	model
		user.js
	db.js
	index.js

其中,users.js文件和db.js文件为之前所写文件,唯一有所变化的部分是user.js引入db.js的路径需要修改。

5.2 封装数据库增删改查

index.js为新建封装数据库的增删改查文件,同时使用promise方法解决异步数据问题。

const sql = {
	//增
    insert(Collection, insertobj) {
        return new Promise((resolve, reject) => {
            Collection.insertMany(insertobj, (err) => {
                if (err) throw err;
                resolve();
            })
        })
    },
    //删
    delete(Collection, whereobj, type) {
        return new Promise((resolve, reject) => {
            let deletetype = 'deleteOne';
            type === 1 ? deletetype = 'deleteMany' : deletetype = 'deleteOne';
            Collection[deletetype](whereobj, (err) => {
                if (err) throw err;
                resolve();
            })
        })
    },
    //改
    update(Collection, whereobj, updateobj, type) {
        return new Promise((resolve, reject) => {
            let updatetype = 'updateOne';
            type === 1 ? updatetype = 'updateMany' : updatetype = 'updateOne';
            Collection[updatetype](whereobj, updateobj, (err) => {
                if (err) throw err;
                resolve();
            })
        })
    },
    //查
    find(Collection, whereobj, showobj) {
        return new Promise((resolve, reject) => {
            Collection.find(whereobj, showobj).exec((err, data) => {
                if (err) throw err;
                resolve(data);
            })
        })
    }
}


module.exports = sql;

5.3 测试数据库的增删改查

测试文件的封装,可立刻检查功能是否实现
插入功能测试文件insertdata.js

const sql=require('./sql');
const User=require('./sql/model/user');

sql.insert(User,{
	username:'李四',
	password:'222',
	age:34,
	tel:'13824586557'
}).then(()=>{
    console.log('success');
    sql.find(User,{},{}).then(data=>{
        console.log(data);
    })
})

删除功能测试文件deletedata.js

const sql=require('./sql');
const User=require('./user');

sql.delete(User,{username:'王富贵'}).then(()=>{
    console.log('success');
    sql.find(User,{},{}).then(data=>{
        console.log(data)
    })
})

修改功能测试文件updatedata.js

const sql=require('./sql');
const User=require('./sql/model/user');

sql.update(User,{username:'张夏'},{$set:{age:11}}).then(()=>{
    console.log('success');
    sql.find(User,{},{}).then(data =>{
        console.log(data);
    })
})

查询功能测试文件find.js

const sql = require('./sql'); 
const User = require('./sql/model/user'); 
sql.find(User,{},{}).then(data=>{
    console.log(data);
})