mongoDB非常灵活,让我们脱离SQL语句来操作数据库MongoDB 教程 | 菜鸟教程www.runoob.com
它是动态的数据库,不需要提前设定表结构,只需要执行代码像操作对象一样操作数据即可
建库等过程是自动实现的
一. 关系型数据库和非关系型数据库
- 表就是关系,表与表之间存在关系
- 所有关系型数据库都需要设计表结构
- 关系型数据库支持约束 如 唯一 主键 默认值 非空 等等
- 非关系型数据库非常灵活
- 好多非关系型数据库就是键值对
- 但是MongoDB是长得最像关系型的非关系型
- 对MongoDB来说: 数据库 --> 数据库
- 数据表 --> 集合(可以想象成一个数组)
- 表记录 --> 文档对象(可以想象成数组存入的对象)
- MongoDB无需设计表结构
- 也就是说: 可以任意存入数据,没有结构这一说
mongodb数据库服务就像一个大对象,里面是一个个的数据库,每个数据库中都有几个集合(列表),每个集合(列表)中都是一对对的键值对数据对象
二.安装
Download Center: Community Serverwww.mongodb.com下载安装,然后配置环境变量
然后打开cmd确认一下,输入 mongod --version
三. 启动和停止数据库服务
1.启动数据库服务
在启动之间先新建一个文件夹 C:datadb,
然后控制台输入:
mongod
2.关闭数据库服务
1.开启服务的控制台,直接ctrl+c即可停止
2.直接关闭控制台
3.连接数据库
在新的CMD中
mongo //默认连接本机数据库
4.断开数据库连接
exit
四. 基本命令
- 显示数据库列表
show dbs //显示所有数据库
2. 查看当前连接的数据库
db
3. 创建新数据库/使用数据库
use 数据库名 //这条命令会切换到某数据库,如果这个数据库不存在,会新建(有数据的瞬间新建)
4. 插入数据
不需要建表,直接写数据 (其实,系统会根据您的命令创建集合,并往集合里写入数据)
db.students.insertOne({"name":"Tom"})
5. 显示集合
show collections
6. 查询集合中的所有数据
db.students.find()
7.增删改查
增:见第七节
查:见第八节
删:见第九节
改:见第十节
五.如何通过node-js操作mongo-db
1.使用官方包mongodb操作(原生的,不推荐使用)
$ npm install mongodb --save
2.使用第三方mongoose来操作
mongoose是基于上述官方包的二次封装.
mongodb是动态的,非常灵活,只需要在 代码中设计数据库,mongoose可以让你的设计编写变得非常简单
Mongoose.js中文网www.mongoosejs.net安装:
cnpm i mongoose --save
使用:
const mongoose = require('mongoose');
//引包
mongoose.connect('mongodb://localhost/test');
//连接数据库
//创建一个模型(设计数据库)
const Cat = mongoose.model('Cat', { name: String });
//表名是cats(里面都是Cat,所以表名是cats) (*^_^*)
//要求里面有一个属性name,类型为字符串
//实例化一个数据
const kitty = new Cat({ name: 'Zildjian' });
//实例了一个小猫kitty,它的名字是Zildjian
//持久化保存这个示例
kitty.save().then(() => console.log('meow'));
接下来解决上面的两个提醒,
看了看是方法将被弃用,应该使用新方法,如果使用新方法,在构建连接时要传入对应的参数,
那就传吧
mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
if(err) return console.log('connection ERR:'+err);
return console.log('connection success');
});
简单查询一下:
六 如何使用mongoose来设计数据库
1.引包
const mongoose = require('mongoose');
2.连接数据库(没有会新建)
mongoose.connect('mongodb://localhost/db2',{useNewUrlParser:true,useUnifiedTopology:true},
(err)=>{
if(err) return console.log('connection ERR:'+err);
return console.log('connection success');
});
3.设计表结构
①.先拿到mongoose的架构模型
var Schema = mongoose.Schema
②.在实例化一个数据模型
var studentSchema = new Schema({
name: String,
age: Number,
gender: Number,
school: String,
hidden: Boolean,
reward: [{ rewardName: String, date: { type: Date, default: Date.now } }],
})
但是,这样设计约束太少了!!!让我们来看约束版本:
name: {
type: String,
required: true,
},
③ 将文档结构发布为模型
var Student=mongoose.model('student',studentSchema)//模型,不是模块.这里要注意单词model
将一个架构发布为一个模型,第一个参数传入一个大写单数字符串,最终mongoose会自动生成一个小写复数的集合(数据表). 可以认为是创建了一个可以持久化存储的类对象.
④ 有了这个类对象之后,我们就可以对数据为所欲为了~
4.模块化设计
我们创建一个model/user.js文件,专门来做数据库模型
const mongoose = require('mongoose');
var Schema = mongoose.Schema
var userSchema = new Schema({
email: { type: String, required: true },
nickname: { type: String, required: true },
password: { type: String, required: true },
created_time: { type: Date, default: Date.now },
//这里不要直接写 Date.now() 如果写了,模块执行时就会写死
last_modified_time: { type: Date, default: Date.now },
avatar: { type: String, default: '/public/img/avatar-default.png' },
bio: { type: String, default: '' },
gender: { type: Number, enum: [0, 1, -1], default: -1 },
birthday: { type: Date },
status: {
type: Number, enum: [0,//正常用户
1,//不可评论
2,//不可登录
]
},
})
module.exports = mongoose.model('User', userSchema)
在app.js中连接数据库
const mongoose = require('mongoose');
//mongoDB
mongoose.connect('mongodb://localhost/db3',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
if(err) return console.log('connection ERR:'+err);
return console.log('connection success');
});
如果哪个地方想用它
var User=require('./models/user')
七 新增数据操作
1.创建一条数据 (实例化一个模型对象)
var stu1=Student({
name:'oliver',
age:18,
gender:1,
school:'湘北中学',
hidden:false
})
2. 存储数据
stu1.save((err,ret)=>{
if(err) return console.log('存储失败'+err);
return console.log('存储成功'+ret)
})
八 查询数据
1.查询所有
Student.find((err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
2.按条件查询
把条件封装成一个对象放在第一个参数即可
Student.find({name:"anny"},(err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
3.只找匹配的第一个
Student.findOne({name:"anny"},(err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
4.按ID查询
Student.findById('5e48ceb5047cfa2bcc970228',(err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
5.多个条件查询
User.find({
$or: [
{ email: req.body.email },
{ nickname: req.body.nickname }
]
}, (err, data) => {})
九 删除数据
1.按条件删除
Student.deleteMany({name:'anny'},(err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
2.按条件删除一个
Student.deleteOne({name:'anny'},(err,ret)=>{
if(err) return console.log(err);
return console.log(ret);
})
还有一种方法
Student.findOneAndDelete({name:'anny'},(err,ret)=>{
if (err) return console.log('失败'+err);
return console.log('成功');
})
3.按ID查询然后删除
Student.findByIdAndDelete("5e48c7118967a217d09e7838", (err, ret) => {
if (err) return console.log('失败'+err);
return console.log('成功');
})
还有一种
Student.findByIdAndRemove("5e48ce979b24812260a0217d", (err, ret) => {
if (err) return console.log('失败'+err);
return console.log('成功');
})
十 修改数据
1.按ID查询然后修改
Student.findByIdAndUpdate('5e48c7118967a217d09e7838',{age:8},(err,ret)=>{
if (err) return console.log('更新失败'+err);
return console.log('更新成功');
})
2.按条件查找然后修改
Student.updateMany({name:'anny'},{age:6},(err,ret)=>{
if (err) return console.log('更新失败'+err);
return console.log('更新成功');
})
3.按条件查找一个然后修改
Student.updateOne({name:'anny'},{age:10},(err,ret)=>{
if (err) return console.log('更新失败'+err);
return console.log('更新成功');
})
还有一种
Student.findOneAndUpdate({name:'anny'},{age:8},(err,ret)=>{
if (err) return console.log('更新失败'+err);
return console.log('更新成功');
})
十一.可视化软件
The Smartest GUI Admin Tool for MongoDBnosqlbooster.com Navicat for MongoDB | MongoDB 数据库管理和开发工具www.navicat.com.cn十二.综合练习
我们将之前写的学生管理系统改为mongodb数据库
之前的版本:
https://github.com/zfdok/node_stu_mgrgithub.com需要的知识:
熊爸天下:node-js备忘(二)zhuanlan.zhihu.com修改后的版本:
https://github.com/zfdok/node_stu_mongoDBgithub.com