typora-copy-images-to: media
MongoDB
关系型数据库和非关系型数据库
关系型数据库
- 表就是关系,或者表与表之间存在关系
- 所有的关系型数据库都需要通过sql语言来操作
- 所有的关系型数据库在操作之前都需要设计表结构
- 数据表还支持约束
- 唯一的
- 主键
- 默认值
- 非空
非关系型数据库
-
非关系型数据库非常灵活
-
有的非关系型数据库就是 key - value 这种键值对
-
MongoDB是最像关系型数据库的非关系型数据库
- 数据库 -- 数据库
- 数据表 -- 集合(数组)
- 表记录 -- 文档对象
-
MongoDB不需要设计表结构,可以任意往里面存数据,没有结构性这一说
-
在插入数据的时候,只需要指定向哪个数据库的哪个集合操作就可以了,剩下的由MongoDB来自动建库,建表
// mongodb { //数据库 qq qq:{ // 集合 users(相当于数据表) users: [ // 文档(相当于表记录) {"name": "Tom", "age": 10}, {"name": "Jack", "age": 10}, {"name": "Hary", "age": 10}, {"name": "Wiston", "age": 10}, ... ], ... }, //数据库 taobao taobao: { ... }, //数据库 baidu baidu: { ... } }
安装
-
下载地址
# 64位地址 https://www.mongodb.com/try/download/community https://www.mongodb.org/dl/win32/ # 32位地址 https://www.mongodb.org/dl/win32/i386
-
配置环境变量
# 将以下目录加入到环境变量的path中 D:Program FilesMongoDBServer3.4in
-
测试是否安装成功
# 查看版本号,顺便测试MongoDB是否安装成功 mongod --version
启动、停止数据库
-
启动
# mongodb 默认使用执行 mongod 命令所在磁盘跟目录下的 /data/db 作为自己的数据存储目录 # 所以在第一次执行该命令之前需要手动新建该目录 /data/db mongod
修改默认的数据存储目录(每次启动都要写)
monod --dbpath=新的数据存储目录的路径
-
停止
- 在开启的服务控制台,直接 Ctrl+C 停止服务
- 直接关闭开启的服务控制台
连接数据库
- 连接
# 该命令默认连接本机的MongoDB服务
mongo
- 退出
# 在连接状态输入下面的命令
exit
基本命令
show dbs
-- 查看显示所有数据库db
-- 查看当前操作的数据库use 数据库名称
-- 切换到指定的数据库,如果没有会新建db.students.insertOne({"name": "Jack"})
-- 插入一条数据到students集合中show colloections
-- 显示当前db下所有的集合(数据表)db.students.find()
-- 查询当前集合下的所有数据
# show dbs
admin 0.000GB
local 0.000GB
# db
test
# use admin
switched to db admin
# db.students.insertOne({"name":"张三"})
{
"acknowledged" : true,
"insertedId" : ObjectId("6012d1b81759b3d9bba8ed3e")
}
# show collections
students
# db.students.find()
{ "_id" : ObjectId("6012d1b81759b3d9bba8ed3e"), "name" : "张三" }
{ "_id" : ObjectId("6012d2a31759b3d9bba8ed3f"), "name" : "李四" }
Node操作MongoDB
使用第三方 mongoose 包操作
mongoose 是基于 官方的 mongodb做的再次封装的包
# 开发项目初始化操作
npm init -y
npm i mongoose --save
# 启动数据库
mongod
入门案例
- mongoose.connect('数据库地址') -- 指定连接的数据库不需要事先存在,当插入第一条数据之后就会被自动创建出来
- new Schema({约束参数}) -- Schema约束的目的:保证数据的完整性,不要有脏数据
- type -- 数据类型
- required -- 必须项
- default -- 默认值
- mongoose.model(模型名, 架构名) -- 将一个架构Schema发布为model(相当于类Class)
- 参数1:首字母大写的单数字符串表示数据库名称,mongoose会自动将该字符串生成一个首字母小写的复数字符串表示为集合名称
- 参数2:架构 Schema
- 返回值:模型构造函数
- 通过返回的模型构造函数,操作集合中的数据
const mongoose = require('mongoose');
// 1. 连接数据库
mongoose.connect('mongodb://localhost/test');
// 2. 设计集合结构
let Schema = mongoose.Schema;
let articleSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
// 3. 将文档结构发布为模型
let Article = mongoose.model('Article',articleSchema);
// 实例化一条数据
let articles = new Article({"name": "陆游"});
// 将数据保存到mongodb数据库中
articles.save((err)=>{
if(err) return console.log(err);
console.log('添加成功'); // { "_id" : ObjectId("6012d87a7849a011d8ff2f42"), "name" : "陆游", "__v" : 0 }
});
-
mongoose所有的API都支持Promise
使用官方的mongodb包操作
# 安装 mongodb
npm install mongodb --save
增删改查
增加数据
- user = new User({数据对象, ...}) -- 生成数据文档
- user.save(function(err, result){}) -- 保存生成的数据文档
// 代码
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, useUnifiedTopology: true});
let Schema = mongoose.Schema;
let userSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
email: String
});
let User = mongoose.model('User', userSchema);
let user = new User({username: '张三', password: '123456', email: '3213213@qq.com'});
user.save((err, result)=>{
if(err)
console.log('添加失败');
else
console.log('添加成功');
console.log(result);
});
// 运行结果
D: 00web2015-Nodejsday03demo-mongoose>node d02-mongodb-增加数据.js
添加成功
{
_id: 60139bfe13017c066453cfa5,
username: '张三',
password: '123456',
email: '3213213@qq.com',
__v: 0
}
查询数据
- Model.find(function(err, result){}) -- 查询所有数据
- Model.find({条件},function(err, result){}) -- 根据条件查询数据
- Model.findOne([{条件},] function(err, result){}) -- [根据条件] 只匹配找到的第一条数据
// 代码
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, newUnifiedTopology: true});
let Schema = mongoose.Schema;
let userSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
email: String
});
let User = mongoose.model('User', userSchema);
// 关键代码
// 查询所有(返回数组)
User.find((err, result)=>{
if(err){
console.log('查询失败');
}else{
console.log(result);
}
});
// 根据条件查询所有(返回数组)
User.find({
username: '张三'
}, (err, result)=>{
if(err){
console.log('查询失败');
}else{
console.log(result);
}
});
// [根据条件]只匹配找到的第一条数据(返回对象 )
User.findOne({
username: '张三'
}, (err, result)=>{
if(err){
console.log('查询失败');
}else{
console.log(result);
}
});
// 运行结果
[
{
_id: 60139a7a74fa682354be671a,
username: '张三',
password: '123456',
email: '3213213@qq.com',
__v: 0
},
{
_id: 60139bfe13017c066453cfa5,
username: '张三',
password: '123456',
email: '3213213@qq.com',
__v: 0
}
]
更新数据
- Model.update(conditions,doc,[options],[callback]) -- 根据条件更新文档数据
- Model.findByIdAndUpdate([id, 更新后内容, options, callback]) -- 根据ID更新文档数据
- Model.findOneAndUpdate([conditions, 更新后内容, options, callback]) -- 根据条件找单条数据并更新该文档数据
删除数据
- Model.remove({条件}, function(err){}) -- 根据条件删除文档数据
- Model.findByIdAndRemove([id, options, callback]) -- 根据ID删除文档数据
- Model.findOneAndRemove([条件, options, callback]) -- 根据条件找单条数据并删除该文档数据
MySQL
安装
npm install mysql --save
入门案例