1.MongoDB
1.1安装
-
64位下载地址:
-
32位下载地址:
-
把C:\Program Files\MongoDB\Server\4.0\bin 放到我的电脑属性/高级设置/环境变量path中
-
启动
#mongodb默认执行mongodb命令所处盘符/data/db作为数据存储目录 所以执行该命令时要创建/data/db mongod
-
关闭
ctrl+c 直接x掉
-
修改默认存储路径
mongod --dbpath=数据存储目录路径
-
MongoDB数据库的基本概念
-
可以有多个数据库
-
一个数据库可以有多个集合(表)
-
一个集合可以有多个文档(表记录)
-
文档结构灵活,没有任何限制
-
不需要像MySQL那样建库 创表 设计表结构 ;mongodb都帮你完成了
{ qq:{ user:[ {name:"张三",age:"20"}, {。。。。。。}, {。。。。。。} ], products:[ ] }, baidu{}, jingdong{} }
-
1.2基本命令
- 使用官方包:https://github.com/mongodb/node-mongodb-native
- 连接数据库:mongo
- 退出数据库:exit
- show dbs
- 查看显示所有数据库
- db
- 查看当前操作的数据库
- use数据库名称
- 切换到指定的数据库(没有会新建一个数据库)
- 但是数据库里没有数据,用show dbs 显示不出来,必须插入数据才能显示
- 对数据库进行修改时,必须先use当前数据库,确定切换到当前数据库才能修改
- 插入数据
- db.students.insertOne({“name”:“zhang”})
- 会自动创建数据表
- 查看当前数据表
- show collections
- 查看表中数据
- db.students.find()
1.3在node中操作mongodb
-
使用官方包:<https://github.com/mongodb/node-mongodb-native
-
第三方包:mongoose对mongodb做了封装 https://mongoosejs.com/
-
mongoose文档:https://mongoosejs.com/docs/guide.html
-
起步
-
安装
npm install mongoose
hello word;
var mongoose = require('mongoose'); // 连接 MongoDB 数据库 mongoose.connect('mongodb://localhost/test', { useMongoClient: true }); mongoose.Promise = global.Promise; // 创建一个模型 // 就是在设计数据库 // MongoDB 是动态的,非常灵活,只需要在代码中设计你的数据库就可以了 // mongoose 这个包就可以让你的设计编写过程变的非常的简单 var Cat = mongoose.model('Cat', { name: String }); for (var i = 0; i < 100; i++) { // 实例化一个 Cat var kitty = new Cat({ name: '喵喵' + i }); // 持久化保存 kitty 实例 kitty.save(function (err) { if (err) { console.log(err); } else { console.log('meow'); } }); }
-
官方指南:
- 设计Scheme发布Model
var mongoose = require('mongoose') var Schema = mongoose.Schema // 1. 连接数据库 // 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来 mongoose.connect('mongodb://localhost/itcast') // 2. 设计文档结构(表结构) // 字段名称就是表结构中的属性名称 // 约束的目的是为了保证数据的完整性,不要有脏数据 var userSchema = new Schema({ username: { type: String, required: true // 必须有 }, password: { type: String, required: true }, email: { type: String } }) // 3. 将文档结构发布为模型 // mongoose.model 方法就是用来将一个架构发布为 model // 第一个参数:传入一个大写名词单数字符串用来表示你的数据表名称 // mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称 // 例如这里的 User 最终会变为 users 集合名称 // 第二个参数:架构 Schema // // 返回值:模型构造函数 var User = mongoose.model('User', userSchema) // 4. 当我们有了模型构造函数之后,就可以使用这个构造函数对 users 集合中的数据为所欲为了(增删改查)
-
增加数据
var admin = new User({ username: 'zs', password: '123456', email: 'admin@admin.com' }) admin.save(function (err, ret) { if (err) { console.log('保存失败') } else { console.log('保存成功') console.log(ret) } })
-
查询数据
User.find(function (err, ret) { if (err) { console.log('查询失败') } else { console.log(ret) } })
-
条件查询
User.find({ username: 'zs' }, function (err, ret) { if (err) { console.log('查询失败') } else { console.log(ret) } })
-
单个查询
User.findOne({ username: 'zs' }, function (err, ret) { if (err) { console.log('查询失败') } else { console.log(ret) } })
-
删除数据
- 根据条件删除所有
User.remove({ username: 'zs' }, function (err, ret) { if (err) { console.log('删除失败') } else { console.log('删除成功') console.log(ret) } })
2.根据条件删除一个
Model.findOneAndRemove(conditions,[options],[callback])
3.根据id删除一个
Model.findByIdAndRemove(id,[options],[callback])
-
-
更新数据
- 根据条件更新所有
Model.updata(conditions, doc,[options],[callback])
2.根据条件跟新一个
Model.findOneAndupdata([conditions],[options],[callback])
3.根据id更新一个
User.findByIdAndUpdate('5a001b23d219eb00c8581184', { password: '123' 这是id }, function (err, ret) { if (err) { console.log('更新失败') } else { console.log('更新成功') } })
-
-
1.4Promise
callback hell
var fs = require('fs')
fs.readFile('./data/a.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
fs.readFile('./data/b.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
fs.readFile('./data/c.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})
})
})
通过回调嵌套的方式来保证顺序
为解决以上编码带来的问题(回调地狱),所以在ES6中新增了 API promise
-
promise英文是承诺 保证的意思 它是一个构造函数
-
promise的基本语法:
var fs = require('fs') var p1 = new Promise(function (resolve, reject) { fs.readFile('./data/a.txt', 'utf8', function (err, data) { if (err) { reject(err) } else { resolve(data) } }) }) p1. .then(function (data) { console.log(data) },function(err){ console.log(err) })
-
封装promise版本的readFile :
var fs = require('fs') function pReadFile(filePath) { return new Promise(function (resolve, reject) { fs.readFile(filePath, 'utf8', function (err, data) { if (err) { reject(err) } else { resolve(data) } }) }) } pReadFile('./data/a.txt') .then(function (data) { console.log(data) return pReadFile('./data/b.txt') }) .then(function (data) { console.log(data) return pReadFile('./data/c.txt') }) .then(function (data) { console.log(data) })
2时间格式转化
/**
* 时间格式化,将时间格式转成字符串
*/
formateDate(datetime) {
// let = "2019-11-06T16:00:00.000Z"
function addDateZero(num) {
return (num < 10 ? "0" + num : num);
}
let d = new Date(datetime);
let formatdatetime = d.getFullYear() + '-' + addDateZero(d.getMonth() + 1) + '-' + addDateZero(d.getDate()) + ' ' + addDateZero(d.getHours()) + ':' + addDateZero(d.getMinutes()) + ':' + addDateZero(d.getSeconds());
return formatdatetime;
},