数据库的介绍

1.1 保存数据的方案

数据在内存 优点:读取数据非常快 缺点:一旦程序关系,数据丢失
数据在文件 优点:文件可以持久保存 缺点:修改数据频繁覆盖文件
数据在数据库 优点:持久保存 管理数据很方便

1.2 数据库的分类

关系型数据库:Oracle Mysql Sqlserver DB2 。数据存在硬盘,查询会相对慢
非关系型数据库:Mongodb Redis HBase。数据在内存,查询会比较快,适合海量数据。

Mongodb的介绍

Mongodb : 最像关系型数据库的非关系型数据库

关系型数据库:

  1. 数据库
  2. 表数据

Mongodb:

  1. 数据库
  2. 集合
  3. 文档

1.mongodb安装

​ 点击安装包傻瓜式的安装 注意不要勾选 compass
​ 安装完毕之后配置环境变量

​ 在c盘根目录下创建data/db文件夹
​ 使用mongod命令来启动mongdb数据库。端口:27017

​ 安装nosqlbooster
使用nosqlbooster连接mongodb数据库

​ 在nosqlbooster中写命令

2.mongodb的常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
show dbs  //显示当前mongodb中的所有数据库

use igeek //切换当前正在使用的数据库

db.student.insert({_id:1,name:"test"}) //向当前数据库的student集合中插入一条数据
db.student.insert({name:"tom"}) //向当前数据库的student集合中插入一条数据,id随机
db.student.remove({name: "tom"}) //删除当前数据库的student集合中的name为tom的数据

db.student.update({name:"kk"},{ $set: { name:"kkk" } },{ upsert:true,multi:true })
//upsert:true 如果在更新的时候没有该数据则会插入一条数据
//multi:true 如果有多个name为kk的数据,多个数据都会发生变化

//如果save()传了id参数,并且id值在原数据库中存在,则会修改数据库中的数据。如果不存在,则会新建一条数据
db.student.save({_id:ObjectId("5cf336d51ff4541f8c5bb63e"),name:"gg",hobbies:["足球","篮球"]})

//此时save()方法没有传入id参数,就会在数据库的表中新建一条数据
db.student.save({name:"ll",hobbies:["足球","篮球"]})

show collections //显示当前数据库下的所有集合
db.student.find() //查询当前数据库student集合下的所有数据
db.dropDatabase() //删除当前数据库

db.createCollection("animal") //在当前数据库下新建一个集合
db.animal.drop() //删除当前数据库下的animal集合

3.mongodb的查询操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
mongoimport –d 数据库的文字 –c 集合的名字 文件名  

db.student.find() 查询当前数据库下的student表的所有内容

//查询姓名是李灵黛的student
db.student.find({name:"李灵黛"})

//查询指定id的学生(id是唯一的)
db.student.find({_id:ObjectId("5cf33cf6a7ba70e3fa58a8e0")})

//查询名字是李念儿的并且年龄是19的人
db.student.find({name:"李念儿",age:19})

//查询名字是李念儿 或者 年龄是19的
db.student.find({$or:[{name:"李念儿"},{age:19}]})

//查询年龄大于30的
db.student.find({age:{$Extra close brace or missing open bracegt:30}})
//查询年龄大于等于30的
db.student.find({age:{$gte:30}})
//查询年龄小于30的
db.student.find({age:{$Extra close brace or missing open bracelt:30}})
//查询年龄小于等于30的
db.student.find({age:{$lte:30}})
//查询年龄等于30的
db.student.find({age:30})
//查询年龄不等于13的
db.student.find({age:{$ne:13}})

//跳过前面1条数据,获取两条数据(可以来做分页查询)
db.student.find().limit(2).skip(1)

//按照年龄排序 -1降序 1升序
db.student.find().sort({age:-1})

//求所有年龄的和
//mongodb中聚合查询 $sum $avg $min $max $first $last
//在mongodb中做聚合查询用aggregate()函数
//聚合查询:可以对一组数据进行查询 得到一个结果
db.student.aggregate( [
{
$group: {
_id: null,
total: { $sum: "$age" }
}
}
] )

//求所有年龄的平均数
db.student.aggregate( [
{
$group: {
_id: null,
total: { $avg: "$age" }
}
}
] )

//求第一个年龄
db.student.aggregate( [
{
$group: {
_id: null,
total: { $first: "$age" }
}
}
] )

4. mongoose的使用

https://mongoosejs.com/docs/api/model.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//1.引入mongoose
var mongoose = require('mongoose');
//2.连接mongdb数据库
mongoose.connect('mongodb://localhost:27017/igeek',{useNewUrlParser:true});
//3.获取连接对象
var db = mongoose.connection;
//4.连接数据库出错的回调
db.on('error', console.error.bind(console, 'connection error:'));
//5.连接数据库成功的回调
db.once('open', function() {
console.log("已连接数据库")
});
//6.创建一个Scheme.这个Scheme是和数据库的集合对应的
//mongoose : ORM框架 Object Relational Mapping 对象关系映射
//Model Student
var studentSchema = new mongoose.Schema({
name: String,
age: Number,
sex: String,
province: String
});
//7.创建一个Model 就和数据库中的students表关联
var Student = mongoose.model('Student', studentSchema);

//8.查询数据库
app.get("/index",(req,res)=>{
//Model.find() 来查数据
Student.find()
.then(function(data){
res.json(data);
},function(err){
res.send("err");
})
})

5.mongoose的常用方法

1
2
3
4
5
6
7
8
app.get("/index",(req,res)=>{
//Model.find() 查询所有数据
// Student.find()
// .then(function(data){
// res.json(data);
// },function(err){
// res.send("err");
// })
//Model.find({name:"zhangsan"}) 根据条件查询数据(返回所有符合条件的数据 数组)
// Student.find({name:"小明"})
// .then(function(data){
//     res.json(data);
// },function(err){
//     res.send("err");
// })

//Model.findOne({})  查询符合条件的数据(只返回一条)
// Student.findOne({name:"小明"})
// .then(function(data){
//     res.json(data);
// },function(err){
//     res.send("err");
// })

//Student.findById("") 根据主键查询指定信息
// Student.findById("5da57082de29900f18144831")
// .then(function(data){
//     res.json(data);
// })

//Student.findByIdAndUpdate("")  根据id找,找到之后修改
// Student.findByIdAndUpdate("5da57082de29900f18144831",{$set:{name:"tt"}})
// .then(function(data){
//     res.json(data);
// })

//Student.findByIdAndDelete("")  根据id找,找到之后删除
// Student.findByIdAndDelete("5da57082de29900f18144831")
// .then(function(data){
//     //data删除的那个元素
//     res.json(data);
// })

// Student.findOne({$or:[{name:"小明"},{age:23}]})  两个条件有任何一个满足返回结果
// Student.findOne({$or:[{name:"小明"},{age:23}]})
// .then(function(data){
//     res.json(data);
// })

// 分页查询
// Student.find()
// .skip(1)
// .limit(2)
// .then(function(data){
//     res.json(data);
// })

// 找age>1 并且age<110的
// Student.find({age: {$gte: 1, $lte: 110}})
// .then(function(data){
//     res.json(data);
// })

//where来指定查询条件
// Student
// .where("age").gte(1).lte(110)
// .where("name","小明")
// .then(function(data){
//     res.json(data);
// })


Student.update({name:"小明"},{$set:{name:"xiaohuang"}})
.then(function(data){
    //修改成功的一些状态信息
    res.json(data);
},function(err){
    console.log(err);
})
})

向数据库新增一个学生
app.get("/addStu",(req,res)=>{
    var stu = new Student({
        _id: new mongoose.Types.ObjectId(),
        name: "小白",
        age: 20,
        email: "11@qq.com",
        birthday: new Date(),
        adult: false,
        message: [{address:"无锡"},12,"我是帅哥"],
        hobbies: ["足球","篮球"],
        scores: [{subject: "语文",score:66},{subject: "数学",score:99}],
        sex:1
    });
    //Model对象.save() 入库
    stu.save()
    .then(function(data){
        //保存数据成功之后会将保存成功的用户返回来
        res.json(data);
    },function(err){
        res.json(err);
    })
})