MongoDB学习笔记--基础篇

之前虽然使用过MongoDB但是没有具体了解,现在准备详细学习下,💪

先上文档:中文版 英文版

了解

首先简单了解下MongoDB

MongoDB是一种文档型数据库,基本组成是文档,集合,数据库。

文档:类比关系型数据库的行数据。

1
{"foo": 3, "greeting": "Hello, world!"}

上面就是一个文档的示例,在文档中我们要有以下的注意点:

  1. 文档区分大小写(同一级),例如fooFoo就是不同的。
  2. key唯一,不可重复
  3. 文档可嵌套,当嵌套的内层可以和外层的主键相同
  4. 键值对是有序的

集合:集合就是一组文档,类比于关系型数据库的表。

集合中的文档无需固定的结构。

集合的命名规则:

  1. 不能是空字符串(””)
  2. 不能包含\0字符(空字符)
  3. 不能使用system.的前缀(系统保留)
  4. 建议不包含保留字$
  5. .分割不同命名空间的子集合(如:blog.users,blog.posts

数据库:多个文档组成一个集合,多个集合就组成了一个数据库。

一个实例可以承载多个数据库。

每个数据库都有独立的权限

保留的数据库名称(admin,local,config

安装

具体下载安装请参文章: MAC安装MongoDB

使用命令行操作数据库(CRUD)

想要对数据进行增删改查我们就要有一个数据库。

查看当前有哪些数据库

1
2
3
4
5
6
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
sqlreview 0.007GB
test 0.000GB

更改数据库

1
2
3
4
> use admin
switched to db admin
> db
admin

新增数据(Create)

我们不需要创建数据库,直接使用就是创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> use students;
switched to db students

> db
students

> show collections;

> student = {
... name : "hongshaorou",
... age: 26}
{ "name" : "hongshaorou", "age" : 26 }

> db.students.insert(student)
WriteResult({ "nInserted" : 1 })

> show collections;
students

> db.students.insert({name: "rendasha"})
WriteResult({ "nInserted" : 1 })

查询数据(Read)

1
2
3
4
5
6
7
8
9
10
11
> db.students.find()
{ "_id" : ObjectId("5c00d11cdf2646d517fd3a2e"), "name" : "hongshaorou", "age" : 26 }
{ "_id" : ObjectId("5c00d1a8df2646d517fd3a2f"), "name" : "rendasha" }

# 返回第一个数据
> db.students.findOne()
{
"_id" : ObjectId("5c00d11cdf2646d517fd3a2e"),
"name" : "hongshaorou",
"age" : 26
}

我们看到MongoDB自动为每个文档创建了唯一的主键。

更新数据(update)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> db.students.findOne()
{
"_id" : ObjectId("5c00d11cdf2646d517fd3a2e"),
"name" : "hongshaorou",
"age" : 26
}

> db.students.update({age: 26}, {$set:{age: 27}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.students.findOne()
{
"_id" : ObjectId("5c00d11cdf2646d517fd3a2e"),
"name" : "hongshaorou",
"age" : 27
}

# 这种更新是替换更新 改变了数据结构
> db.students.update({age: 27}, {age: 28})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.students.findOne()
{ "_id" : ObjectId("5c00d11cdf2646d517fd3a2e"), "age" : 28 }

删除数据(Delete)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> db.students.find()
{ "_id" : ObjectId("5c00d11cdf2646d517fd3a2e"), "age" : 28 }
{ "_id" : ObjectId("5c00d1a8df2646d517fd3a2f"), "name" : "rendasha" }

> db.students.remove({age: 28})
WriteResult({ "nRemoved" : 1 })

> db.students.find()
{ "_id" : ObjectId("5c00d1a8df2646d517fd3a2f"), "name" : "rendasha" }

> db.students.remove({})
WriteResult({ "nRemoved" : 1 })

> db.students.find()

如果我们没有指定条件 则是删除所有的。

一个练习
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
db.students.insertMany(
[
{ name: "bob", age: 16, sex: "male", grade: 95},
{ name: "ahn", age: 18, sex: "female", grade: 45},
{ name: "xi", age: 15, sex: "male", grade: 75},
{ name: "bob1", age: 16, sex: "male", grade: 95},
{ name: "ahn1", age: 18, sex: "male", grade: 45},
{ name: "xi1", age: 15, sex: "female", grade: 55},
{ name: "bob2", age: 16, sex: "female", grade: 95},
{ name: "ahn2", age: 18, sex: "male", grade: 60},
{ name: "xi2", age: 15, sex: "male", grade: 75},
{ name: "bob3", age: 16, sex: "male", grade: 95},
{ name: "ahn3", age: 18, sex: "female", grade: 45},
{ name: "xi3", age: 15, sex: "male", grade: 85},
{ name: "bob4", age: 16, sex: "female", grade: 95},
{ name: "ahn4", age: 18, sex: "male", grade: 45},
{ name: "xi4", age: 15, sex: "male", grade: 75}
]
)


查询所有的男生数据(只需要学生的姓名和年龄)
> db.students.find({sex:"male"},{name:1, age:true, _id:0})

查询成绩及格的学生信息(学生成绩大于或等于60分)
> db.students.find({grade: {'$gte': 60}})

查询所有18岁的男生和16岁的女生的数据
> db.students.find({'$or': [{sex: 'male', age: 18}, {sex: 'female', age:16}]})

按照学生的年龄进行排序
> db.students.find().sort({age:1}) 1 是升序 -1 是降序

将所有的女学生年龄增加一岁
> db.students.update({sex: "female"}, {'$inc': {age:1}}, {multi:true})
WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 5 })
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!