mongo操作数据库

1、回顾

2、node + mongodb

2.1 安装mongodb

项目中既可以使用mongodb,但是推荐使用mongoose

cnpm i mongoose@4 -S

2.2 连接数据库

一定要确保数据库连接池是打开的

创建db.js

const mongoose = require('mongoose'); // 引入模块
const DB_URL = 'mongodb://localhost:27017/sh1908'; // 数据库连接地址

// 连接数据库
// mongoose.connect(DB_URL);
mongoose.connect(DB_URL, { useNewUrlParser: true });

// 数据库连接成功
mongoose.connection.on('connected', () => {
  console.log('数据库连接成功')
})

// 数据库断开或者连接失败
mongoose.connection.on('disconnected', () => {
  console.log('数据库断开')
})

// 数据库连接异常
mongoose.connection.on('error', () => {
  console.log('数据库连接异常')
})

2.3 将 db.js 封装成模块,供后续业务逻辑使用

const mongoose = require('mongoose');
const DB_URL = 'mongodb://localhost:27017/sh1908';

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;

2.4 设计用户的集合 --- 设计表

const mongoose = require('./../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象

// 设计用户表的集合
const userSchema = new Schema({ // 设计用户集合的字段以及数据类型
  username: { type: String },
  password: { type: String },
  age: { type: Number },
  lesson: { type: Number },
  sex: { type: Number },
  city: { type: String },
  company: { type: String }
})

// 无则创建数据库集合并且连接,有则连接,并且暴露出去\
// mongoose.model('User', userSchema); 创建出一个数据库集合 users
// mongoose.model('Test', userSchema); 创建出一个数据库集合 tests
module.exports = mongoose.model('User', userSchema);

3、数据的增删改查

3.1 查

// 1、拿到数据库的集合
const User = require('./collection/users.js');

// 第一个 {} 查询的条件
// 第二个 {} 显示的字段
// () => {}  回调函数显示查询的结果 ------ node中错误优先回调?????(作业)
// User.find({}, {}, (err, data) => {
//   if (err) {
//     console.log(err)
//   } else {
//     console.log(data)
//   }
// })

User.find({}, {_id: 0, username: 1, age: 1}).exec((err, data) => {
  if (err) throw err // 抛出异常,代码不再继续往下执行
  console.log(data)

})

3.2 增

// 找到用户表
const User = require('./collection/users'); // .js可以省略

// User.insert() xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// User.insertOne() xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// User.insertMany() √√√√√√√√√√√√√√√√√√√√√√√√√√√√
User.insertMany({
  username: '美少女',
  password: '971228',
  age: 21,
  sex: 1,
  lesson: 3,
  city: '安徽',
  company: '千锋'
}, (err) => {
  if (err) throw err;
  console.log('插入成功')
})

3.3 删除数据

美少女

// 找到用户集合
const User = require('./collection/users');

// User.deleteOne({username: '美少女'}, (err) => {
//   if (err) throw err;
//   console.log('删除成功')
// })

User.deleteMany({username: /美少女/}, (err) => {
  if (err) throw err;
  console.log('删除成功')
})

3.4 改

const User = require('./collection/users');

// User.updateOne({username: '美少女1'}, { $set: {age: 25} }, (err) => {
//   if (err) throw err;
//   console.log('修改成功')
// })

User.updateMany({}, { $inc: {age: 1} }, (err) => {
  if (err) throw err;
  console.log('修改成功')
})

4、封装增删改查的操作

sql.js

const sql = {
  insert () {

  },
  delete () {

  },
  update () {

  },
  find () {

  }
}

module.exports = sql

4.1 封装插入方法

insert (CollectionName, insertData) {
    // 数据库的操作属于异步操作,后续的业务逻辑会交给执行的那个单位
    // A 调用了B B包含异步操作,操作完毕 A继续执行业务逻辑
    // 异步操作  --- 回调函数 / promise / generator + yeild / async + await
    // User.insertMany(insertData, (err) => {
    //   if (err) throw err;
    //   console.log('插入成功')
    // })
    // promise的写法
    // return new Promise((resolve, reject) => {
    // })
    return new Promise((resolve, reject) => {
      CollectionName.insertMany(insertData, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  }

如何调用 sql_insert.js

const User = require('./collection/users');
const sql = require('./sql')

sql.insert(User, {
  username: '美少女3',
  password: '123456',
  age: 20,
  lesson: 2,
  sex: 0,
  city: '上海',
  company: '千锋'
}).then(() => {
  console.log('插入数据成功')
})

4.2 封装删除模块

delete (CollectionName, deleteData, deleteType) {
    // User.deleteOne(deleteData, (err) => {})
    // User.deleteMany(deleteData, (err) => {})

    // style.display = "none"   <===>  style['display'] = "none"
    // style.animation = "test" 兼容性 
    // 对象后的属性不可以是变量,如果有变量,写成 对象[属性] 形式
    
    deleteType = deleteType || 'deleteOne' // 默认为删除单条数据

    return new Promise((resolve, reject) => {
      CollectionName[deleteType](deleteData, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  }

测试删除模块 sql_delete.js

const User = require('./collection/users');
const sql = require('./sql');

// sql.delete(User, { username: '美少女3'}).then(() => {
//   console.log('删除成功')
// })

sql.delete(User, { username: /美少女/}, 'deleteMany').then(() => {
  console.log('删除成功')
})

4.3 封装修改模块

update (CollectionName, whereObj, updateObj, updateType) {
    updateType = updateType || 'updateOne'
    return new Promise((resolve, reject) => {
      CollectionName[updateType](whereObj, updateObj, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  }

测试修改模块 sql_update.js

const User = require('./collection/users');
const sql = require('./sql');

// sql.update(User, { username: '操鑫' }, { $set: { age: 28 }}).then(() => {
//   console.log('修改成功')
// })

sql.update(User, {}, { $inc: { age: 1 }}, 'updateMany').then(() => {
  console.log('修改成功')
})

4.4 封装查询数据模块

find (CollectionName, whereObj, showObj) {
    return new Promise((resolve, reject) => {
      CollectionName.find(whereObj, showObj).exec((err, data) => {
        if (err) throw err;
        resolve(data)
      })
    })
  }

测试查询模块 sql_find.js

const User = require('./collection/users');
const sql = require('./sql');

sql.find(User, {}, {_id:0, username: 1, age: 1, sex: 1}).then(data => {
  console.log(data)
})

5、express + node

5.1 准备工作

前后端不分离开发 --- 前端负责写页面,后端负责渲染 --- admin-lte

5.2 创建express项目

express myapp --view=ejs
cd myapp
cnpm i
cnpm run start

服务器的代码修改,需要重新启动服务器,感觉很麻烦

cnpm i supervisor -g // 可以修改代码只有不用一直重新启动服务器

  • 修改package.json文件的scripts选项
"scripts": {
  "start": "node ./bin/www",
  "dev": "supervisor ./bin/www"
},

cnpm run dev

5.3 集成前端的模板到express项目中

1、打开starter.html的源码部分,复制代码至 views/index.ejs

2、解决样式问题,index.ejs部分,将css和js开头处添加一个 /, 复制相应的文件夹到项目的public文件加内

5.4 分解页面

<%- include('')%>

header.ejs / menu.ejs / sildebar.ejs / footer.ejs

1、打开index.ejs页面,点击左侧的缩进代码,将每一部分代码复制到相应的ejs模板内容

2、使用 <%- include('')%> 在相应的位置引入 ejs 模板

5.5 设计菜单管理

打开menu.ejs,修改代码

------ 首页+用户管理+产品管理

5.6 设计页面的表格

打开starter.html,点击左上角的logo,选择左侧的tables,再选择Simple tables

右键选择第一个表格, 右键 -> copy -> copy outerhtml

回到index.ejs,在你的主体部分,提示语句(输入部分),直接粘贴进去

上一篇:javascript-如何使用本机节点驱动程序在节点服务器上执行mongo查询字符串?


下一篇:javascript-使用Mongoose将数组(“标签”)保存到MongoDB