MongoDB
文档
{
"foo": 3,
"greeting" : "Hello World!"
}
- 区分大小写
- key值唯一,不可重复
- 文档可嵌套
- 键值对是有序的
集合
集合就是一组文档。
文档类似关系型数据库的行
集合类似关系型数据库的表
集合中的文档无需固定的结构
命名规则
- 不能是空字符串
- 不能包含\0字符
- 不能使用system.的前缀
- 建议不包含保留字 “$”
- 用.分割不同命名空间的子集合
数据库
- 多个文档组成的集合,多个集合组成数据库
- 一个实例可以承载多个数据库
- 每个数据库都有独立的权限
- 保留的数据库的名称(admin, local ,config)
安装
两个下载地址,下载的版本为4.2.2
https://www.mongodb.com/download-center/community
https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-server_4.2.2_amd64.deb
对于下载下来的deb文件,可以直接点击安装,也可以使用命令安装
sudo dpkg -i mongodb-org-server_4.2.2_amd64.deb
如果出现依赖问题,可以执行
sudo apt -f install
去解决依赖问题,然后重新安装就可以
启动
对于ubuntu使用命令
sudo service mongod start
然后可以查看状态
$ sudo netstat -laput | grep mongod
tcp 0 0 localhost:27017 0.0.0.0:* LISTEN 28110/mongod
安装mongodb-clients
sudo apt install mongodb-clients
然后就可以使用mongo命令使用Mongodb Shell与数据库进行交互了。
使用命令行操作数据库
CRUD
新增数据(Create)
显示数据库
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
使用数据库,使用use命令,如果数据库不存在,就会创建这个数据库
> use students;
switched to db students
设置一个文档
> stu = {name : 'John', age: 21}
{ "name" : "John", "age" : 21 }
插入到数据库中
> db.students.insert(stu)
WriteResult({ "nInserted" : 1 })
说明已经成功的插入数据了。
查询数据(Read)
> db.students.find()
{ "_id" : ObjectId("5e09ae6f8ac520f21c51707f"), "name" : "John", "age" : 21 }
{ "_id" : ObjectId("5e09aed48ac520f21c517080"), "name" : "Tom" }
查询一条数据
> db.students.findOne()
{
"_id" : ObjectId("5e09ae6f8ac520f21c51707f"),
"name" : "John",
"age" : 21
}
可以得到一条格式完整的数据
修改数据(Update)
从数据中先查询出来,然后修改之后,再更新。因为直接更新会覆盖原来的数据,不能单独更新字段。
> s = db.students.findOne()
{
"_id" : ObjectId("5e09ae6f8ac520f21c51707f"),
"name" : "John",
"age" : 21
}
> db.students.update({name:'John'},{name : 'JohnC'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> s = db.students.findOne()
{ "_id" : ObjectId("5e09ae6f8ac520f21c51707f"), "name" : "JohnC" }
但是这种每次都只能更改一条数据,对于需要用于条件更新的数据,我们可以使用其他的方式去更新数据
删除数据(Delete)
> db.students.remove({name: 'Amy'})
WriteResult({ "nRemoved" : 1 })
使用remove就可以根据条件删除数据了。
但是如果我们没有条件,就会清空整个数据库。
练习
任务
- 创建一个学生信息表(至少包含:姓名,性别,成绩,年龄)
- 写入至少15条不同的信息
- 查询所有男生的数据(只需要学生的姓名和年龄)
- 查询成绩集合的学生信息(学生成绩大于或等于60分)
- 查询所有18岁的年龄和16岁的女生的数据
- 按照学生的年龄进行排序
- 将所有的女学生年龄增加一岁。
插入数据
> db.students.insertMany(
... [
... {name: 'bob', age: 16,sex: 'male',grade: 45},
... {name: 'bob2', age: 18, sex: 'male',grade: 60},
... {name: 'bob3', age: 20, sex: 'male',grade: 70},
... {name: 'Tom', age: 16, sex: 'female',grade: 80},
... {name: 'Tom2', age: 18, sex: 'female',grade: 55},
... {name: 'Tom3', age: 17, sex: 'female',grade: 99},
... {name: 'xi1', age: 15, sex: 'male',grade: 89},
... {name: 'xi2', age: 16, sex: 'female',grade: 70},
... {name: 'xi3', age: 17, sex: 'male',grade: 75},
... {name: 'ahn', age: 16, sex: 'female',grade: 45},
... {name: 'ahn1', age: 18, sex: 'male',grade: 66},
... {name: 'ahn2', age: 19, sex: 'female',grade: 77},
... {name: 'ahn3', age: 15, sex: 'male',grade: 88},
... {name: 'john', age: 16, sex: 'female',grade: 90},
... {name: 'john1', age: 17,sex: 'male',grade: 84},
... {name: 'john2', age: 17, sex: 'female',grade: 80},
... {name: 'john3', age: 18,sex: 'male',grade: 100}
... ]
... )
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5e09ba2b8ac520f21c517083"),
ObjectId("5e09ba2b8ac520f21c517084"),
ObjectId("5e09ba2b8ac520f21c517085"),
ObjectId("5e09ba2b8ac520f21c517086"),
ObjectId("5e09ba2b8ac520f21c517087"),
ObjectId("5e09ba2b8ac520f21c517088"),
ObjectId("5e09ba2b8ac520f21c517089"),
ObjectId("5e09ba2b8ac520f21c51708a"),
ObjectId("5e09ba2b8ac520f21c51708b"),
ObjectId("5e09ba2b8ac520f21c51708c"),
ObjectId("5e09ba2b8ac520f21c51708d"),
ObjectId("5e09ba2b8ac520f21c51708e"),
ObjectId("5e09ba2b8ac520f21c51708f"),
ObjectId("5e09ba2b8ac520f21c517090"),
ObjectId("5e09ba2b8ac520f21c517091"),
ObjectId("5e09ba2b8ac520f21c517092"),
ObjectId("5e09ba2b8ac520f21c517093")
]
}
> db.students.find()
{ "_id" : ObjectId("5e09ba2b8ac520f21c517083"), "name" : "bob", "age" : 16, "sex" : "male", "grade" : 45 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517084"), "name" : "bob2", "age" : 18, "sex" : "male", "grade" : 60 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517085"), "name" : "bob3", "age" : 20, "sex" : "male", "grade" : 70 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517086"), "name" : "Tom", "age" : 16, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517087"), "name" : "Tom2", "age" : 18, "sex" : "female", "grade" : 55 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517088"), "name" : "Tom3", "age" : 17, "sex" : "female", "grade" : 99 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517089"), "name" : "xi1", "age" : 15, "sex" : "male", "grade" : 89 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708a"), "name" : "xi2", "age" : 16, "sex" : "female", "grade" : 70 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708b"), "name" : "xi3", "age" : 17, "sex" : "male", "grade" : 75 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708c"), "name" : "ahn", "age" : 16, "sex" : "female", "grade" : 45 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708d"), "name" : "ahn1", "age" : 18, "sex" : "male", "grade" : 66 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708e"), "name" : "ahn2", "age" : 19, "sex" : "female", "grade" : 77 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708f"), "name" : "ahn3", "age" : 15, "sex" : "male", "grade" : 88 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517090"), "name" : "john", "age" : 16, "sex" : "female", "grade" : 90 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517091"), "name" : "john1", "age" : 17, "sex" : "male", "grade" : 84 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517092"), "name" : "john2", "age" : 17, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517093"), "name" : "john3", "age" : 18, "sex" : "male", "grade" : 100 }
查询所有的男生的数据
> db.students.find({sex:'male'})
{ "_id" : ObjectId("5e09ba2b8ac520f21c517083"), "name" : "bob", "age" : 16, "sex" : "male", "grade" : 45 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517084"), "name" : "bob2", "age" : 18, "sex" : "male", "grade" : 60 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517085"), "name" : "bob3", "age" : 20, "sex" : "male", "grade" : 70 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517089"), "name" : "xi1", "age" : 15, "sex" : "male", "grade" : 89 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708b"), "name" : "xi3", "age" : 17, "sex" : "male", "grade" : 75 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708d"), "name" : "ahn1", "age" : 18, "sex" : "male", "grade" : 66 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c51708f"), "name" : "ahn3", "age" : 15, "sex" : "male", "grade" : 88 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517091"), "name" : "john1", "age" : 17, "sex" : "male", "grade" : 84 }
{ "_id" : ObjectId("5e09ba2b8ac520f21c517093"), "name" : "john3", "age" : 18, "sex" : "male", "grade" : 100 }
将不需要的字段去掉
> db.students.find({sex:'male'},{name:1 , age: true})
{ "_id" : ObjectId("5e09bb927701891d3a867024"), "name" : "bob", "age" : 16 }
{ "_id" : ObjectId("5e09bb927701891d3a867025"), "name" : "bob2", "age" : 18 }
{ "_id" : ObjectId("5e09bb927701891d3a867026"), "name" : "bob3", "age" : 20 }
{ "_id" : ObjectId("5e09bb927701891d3a86702a"), "name" : "xi1", "age" : 15 }
{ "_id" : ObjectId("5e09bb927701891d3a86702c"), "name" : "xi3", "age" : 17 }
{ "_id" : ObjectId("5e09bb927701891d3a86702e"), "name" : "ahn1", "age" : 18 }
{ "_id" : ObjectId("5e09bb927701891d3a867030"), "name" : "ahn3", "age" : 15 }
{ "_id" : ObjectId("5e09bb927701891d3a867032"), "name" : "john1", "age" : 17 }
{ "_id" : ObjectId("5e09bb927701891d3a867034"), "name" : "john3", "age" : 18 }
在查询条件后面加上显示的条件,用1或者true来表示是否显示字段。
> db.students.find({sex:'male'},{name:1 , age: true,_id:0})
{ "name" : "bob", "age" : 16 }
{ "name" : "bob2", "age" : 18 }
{ "name" : "bob3", "age" : 20 }
{ "name" : "xi1", "age" : 15 }
{ "name" : "xi3", "age" : 17 }
{ "name" : "ahn1", "age" : 18 }
{ "name" : "ahn3", "age" : 15 }
{ "name" : "john1", "age" : 17 }
{ "name" : "john3", "age" : 18 }
也可以隐藏id
查询及格的学生
> db.students.find({grade:{'$gte':60}})
{ "_id" : ObjectId("5e09bb927701891d3a867025"), "name" : "bob2", "age" : 18, "sex" : "male", "grade" : 60 }
{ "_id" : ObjectId("5e09bb927701891d3a867026"), "name" : "bob3", "age" : 20, "sex" : "male", "grade" : 70 }
{ "_id" : ObjectId("5e09bb927701891d3a867027"), "name" : "Tom", "age" : 16, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09bb927701891d3a867029"), "name" : "Tom3", "age" : 17, "sex" : "female", "grade" : 99 }
{ "_id" : ObjectId("5e09bb927701891d3a86702a"), "name" : "xi1", "age" : 15, "sex" : "male", "grade" : 89 }
{ "_id" : ObjectId("5e09bb927701891d3a86702b"), "name" : "xi2", "age" : 16, "sex" : "female", "grade" : 70 }
{ "_id" : ObjectId("5e09bb927701891d3a86702c"), "name" : "xi3", "age" : 17, "sex" : "male", "grade" : 75 }
{ "_id" : ObjectId("5e09bb927701891d3a86702e"), "name" : "ahn1", "age" : 18, "sex" : "male", "grade" : 66 }
{ "_id" : ObjectId("5e09bb927701891d3a86702f"), "name" : "ahn2", "age" : 19, "sex" : "female", "grade" : 77 }
{ "_id" : ObjectId("5e09bb927701891d3a867030"), "name" : "ahn3", "age" : 15, "sex" : "male", "grade" : 88 }
{ "_id" : ObjectId("5e09bb927701891d3a867031"), "name" : "john", "age" : 16, "sex" : "female", "grade" : 90 }
{ "_id" : ObjectId("5e09bb927701891d3a867032"), "name" : "john1", "age" : 17, "sex" : "male", "grade" : 84 }
{ "_id" : ObjectId("5e09bb927701891d3a867033"), "name" : "john2", "age" : 17, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09bb927701891d3a867034"), "name" : "john3", "age" : 18, "sex" : "male", "grade" : 100 }
'$gte’表示大于等于
查询所有18岁男生和16岁女生的数据
> db.students.find({'$or':[{sex:'male', age:18},{sex:'female', age:16}]})
{ "_id" : ObjectId("5e09bb927701891d3a867025"), "name" : "bob2", "age" : 18, "sex" : "male", "grade" : 60 }
{ "_id" : ObjectId("5e09bb927701891d3a867027"), "name" : "Tom", "age" : 16, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09bb927701891d3a86702b"), "name" : "xi2", "age" : 16, "sex" : "female", "grade" : 70 }
{ "_id" : ObjectId("5e09bb927701891d3a86702d"), "name" : "ahn", "age" : 16, "sex" : "female", "grade" : 45 }
{ "_id" : ObjectId("5e09bb927701891d3a86702e"), "name" : "ahn1", "age" : 18, "sex" : "male", "grade" : 66 }
{ "_id" : ObjectId("5e09bb927701891d3a867031"), "name" : "john", "age" : 16, "sex" : "female", "grade" : 90 }
{ "_id" : ObjectId("5e09bb927701891d3a867034"), "name" : "john3", "age" : 18, "sex" : "male", "grade" : 100 }
按照学生的年龄进行排序
> db.students.find().sort({age:1})
{ "_id" : ObjectId("5e09bb927701891d3a86702a"), "name" : "xi1", "age" : 15, "sex" : "male", "grade" : 89 }
{ "_id" : ObjectId("5e09bb927701891d3a867030"), "name" : "ahn3", "age" : 15, "sex" : "male", "grade" : 88 }
{ "_id" : ObjectId("5e09bb927701891d3a867024"), "name" : "bob", "age" : 16, "sex" : "male", "grade" : 45 }
{ "_id" : ObjectId("5e09bb927701891d3a867027"), "name" : "Tom", "age" : 16, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09bb927701891d3a86702b"), "name" : "xi2", "age" : 16, "sex" : "female", "grade" : 70 }
{ "_id" : ObjectId("5e09bb927701891d3a86702d"), "name" : "ahn", "age" : 16, "sex" : "female", "grade" : 45 }
{ "_id" : ObjectId("5e09bb927701891d3a867031"), "name" : "john", "age" : 16, "sex" : "female", "grade" : 90 }
{ "_id" : ObjectId("5e09bb927701891d3a867029"), "name" : "Tom3", "age" : 17, "sex" : "female", "grade" : 99 }
{ "_id" : ObjectId("5e09bb927701891d3a86702c"), "name" : "xi3", "age" : 17, "sex" : "male", "grade" : 75 }
{ "_id" : ObjectId("5e09bb927701891d3a867032"), "name" : "john1", "age" : 17, "sex" : "male", "grade" : 84 }
{ "_id" : ObjectId("5e09bb927701891d3a867033"), "name" : "john2", "age" : 17, "sex" : "female", "grade" : 80 }
{ "_id" : ObjectId("5e09bb927701891d3a867025"), "name" : "bob2", "age" : 18, "sex" : "male", "grade" : 60 }
{ "_id" : ObjectId("5e09bb927701891d3a867028"), "name" : "Tom2", "age" : 18, "sex" : "female", "grade" : 55 }
{ "_id" : ObjectId("5e09bb927701891d3a86702e"), "name" : "ahn1", "age" : 18, "sex" : "male", "grade" : 66 }
{ "_id" : ObjectId("5e09bb927701891d3a867034"), "name" : "john3", "age" : 18, "sex" : "male", "grade" : 100 }
{ "_id" : ObjectId("5e09bb927701891d3a86702f"), "name" : "ahn2", "age" : 19, "sex" : "female", "grade" : 77 }
{ "_id" : ObjectId("5e09bb927701891d3a867026"), "name" : "bob3", "age" : 20, "sex" : "male", "grade" : 70 }
如果age为-1表示为逆序。
将所有的女学生年龄增加1岁
> db.students.update({sex:'female'},{'$inc':{age:1}}, {multi:true})
WriteResult({ "nMatched" : 8, "nUpserted" : 0, "nModified" : 8 })
使用$inc来增加值,使用multi来改变多条数据。
图形界面
对于图形管理工具,我使用的是DataGrip或者是Robomongo,DataGrip可以连接多种数据库还是很方便的。