MongoDB的数据结构
》MongoDB用BSON(二进制JSON)来保存数据。一条记录就是一个BSON,被称作文档(Document)
》某些BSON聚集在一起,就形成了集合(Collection)
管理逻辑库
创建/切换逻辑库
use test
查看逻辑库
show dbs
删除逻辑库
db.dropDatabase()
// 需要先切换到逻辑库中才能输入次命令完成删除操作
管理集合 【集合类似于sql中的表]
创建集合
db.createCollection("student")
查看集合
show collections
删除集合
db.student.drop()
查看集合记录数量
db.student.count()
查看数据空间容量
db.student.dataSize()
重命名集合
db.student.renameCollection("stu")
添加记录
集合的save函数允许我们添加一条或者多条记录
db.student.save([
{name:"小明",sex:"男",birthday:"2009-10-22"},
{name:"小美",sex:"女",birthday:"2009-12-12"},
{name:"小刚",sex:"男",birthday:"2009-07-09"},
])
主键值(ObjectId)
》在集合中,文档之间都是松散的,没有统一的字段约束。为了标识文档的唯一性,MongoDB为每个文档都添加了主键字段(_id)
》ObjectId是一个12字节的BSON类型字符串
查询记录
》find函数可以从集合中提取记录,参数为查询条件
表达式
》MongoDB的表达式必须写成JSON格式
一:
use school
/*
db.student.find({
age:{$gte:20,$lte:30}
})
db.student.find(
city:{$nin:["北京","上海"]}
})
*/
db.student.find({name:{$ne:"小明"}})
二:
use school
//查询身份是班主任的老师
db.teacher.save({name:"jack",role:["班主任","校长"]})
db.teacher.find({role:{$all:["班主任","校长"]}})
//查询年龄不在28-30岁之间的学生
db.student.find({
age:{$not:{$gte:28,$lte:30}}
})
//查询30岁以下的男学生,或者25岁以下的女学生
db.student.find({$or:[{age:{$lt:30},sex:"男"},{age:{$lt:25},sex:"女"}]})
//查询含有age字段的学生
db.student.find({age:{$exists:1}}) //1是必须的,相当于true
正则表达式
》MongoDB支持正则表达式查找数据
如下:
db.student.find({name:/^李/}) //匹配姓李的同学
db.student.find({name:/^[a-zA-Z]{2,10}$/}) //匹配名字为英文且长度为2-10之间的同学
分页查找数据
》可以利用skip()和limit()实现分页查询
// find中可传参数,不传则表示查全部
db.student.find().limit(10) // 取分页查询结果的前10条记录
db.student.find().skip(20).limit(10) // 从第20条记录开始,往后查10条记录
数据排序
》sort()函数可以用来对结果集排序。1代表升序,-1代表降序
db.student.find().sort({name:1})
db.student.find().sort({name:-1}).skip(10).limit(10)
// 注意,如果需要在排序中使用分页,那么需要先写排序才可以写分页。顺序不能错
排除重复
》distinct()函数替代find()函数查找不重复的记录
db.student.distinct("name") // 该方法返回的是js的数据类型(即js中的数组格式)
db.student.distinct("name").sort(function(){return -1}) //调用js的数组的sort()方法可以实现排序功能,但需要传递一个匿名函数即可
db.student.distinct("name").slice(0,5) //调用js的数组的slice()方法可以实现分页查询
修改记录
1》update()和updateMany()函数能实现对记录的修改
写法:db.collection.updateMany({condition},{$set:{data}})
update()
表示更新一条符合条件的数据updateMany()
表示更新所有符合条件的数据
[condition
参数可以不传入,但是{}
需要写上;set
参数会指定设置后面的data
信息,如果没有该data
值,则创建该值]
// 设置小明的年龄为26,班级为2-6
db.student.update({name:"小明"},{$set:{age:26,classno:"2-6"}})
// 设置所有性别为男,年龄大于等于25的同学,班级为2-6
db.student.updateMany({sex:"男",age:{$gte:25}},{$set:{classno:"2-6"}})
2.1》$unset:可以删除记录中的字段
写法:db.collection.updateMany({condition},{$unset:{data:1,data:1}})
[1
表示true
,同样的condition参数可以不传入,但是{}
需要写上]
2.2》$inc:对某个字段值做加法运算
写法:db.collection.updateMany({condition},{$inc:{data:num}})
[后面的num
表示加多少,同样的condition参数可以不传入,但是{}
需要写上]
// 删除每个学生记录的city和tel属性
db.student.updateMany({},{$unset:{city:1,tel:1}})
// 把每个学生记录的age属性都加上2,若没有age属性,则会添加该属性并加2
db.student.updateMany({},{$inc:{age:2}})
3.1》$push:可以向数组属性添加元素
写法:db.collection.update({condition},{$push:{数组属性:值}})
3.2》$pull:可以删除数组属性的元素
写法:db.collection.update({condition},{$pull:{数组属性:值}})
// 给jack记录添加教务主任角色
db.teacher.update({name:"jack"},{$push:{role:"教务主任"}})
// 删除jack的校长角色
db.teacher.update({name:"jack"},{$pull:{role:"校长"}})
删除记录
》remove()函数可以删除记录
写法:db.collection.remove({condition})
// 删除所有教师记录
db.teacher.remove({})
// 删除2-6班所有的男同学
db.student.remove({classno:"2-6",sex:"男"})
数据索引
1.创建索引的语法
》因为MongoDB中存放了大量的数据,所以为了加快数据检索速度,需要为集合设置索引
》索引字段按照升序排列,属性值为1;降序排列属性值为-1
写法:db.collection.createIndex({key:1},options)
[options
参数可以添加其他内容,如name属性,设置索引的名称]
2.创建索引的案例
db.student.createIndex({name:1})
// 普通索引的创建
db.student.dropIndexes()
// 删除索引 ()里面如果添加了索引的名称则表示删除该名称的索引,否则删除所有索引
db.student.createIndex({name:1},{background:true})
// 因为创建索引的过程会阻塞MongoDB,影响其他增删改查操作,所以background参数代表在空闲的时候创建索引(推荐使用该写法)
db.student.getIndexes()
// 查看索引的内容,打印索引的列表信息
①如图,使用该命令创建索引,会在表的索引下方创建一个以“name_1”命名的索引文件
②如图,使用该命令删除索引,会在表的索引下方删除该索引
③如图,使用该命令创建非阻塞索引,并且传入name属性将索引名称更改为“name”
④如图,使用该命令可以查看索引的内容
3.唯一性索引
》唯一性索引只能创建在每个记录都含有的公共字段上,在非公共字段上不能创建唯一性索引的。
写法:db.collection.createIndex({key:1},{unique:true})
[unique为true表示唯一性,key字段需要在表中所有的表信息都有该key字段,且该key字段的值唯一,才能创建成功,否则会报错]
如图:注释部分就是创建了唯一索引;而后面一句往表中插入该数据则会报错(因为该sid=8001的值已存在,不能再被创建成功)!!!
4.创建索引的原则
① 数据量很大的集合必须创建索引,相反则不需要创建索引
② 集合的数据读取多过写入,则需要创建索引
③ 给经常被当作查询条件的字段设置索引
数据导入与导出
1.导出集合数据
》mongoexport
命令可以把一个集合的数据导出成JSON或者CSV格式的文件
mongoexport --host=localhost --port=27017 -u admin -p abc123456 --authenticationDatabase=admin -d school -c student -f "_id,name,sex,age" -o D:/student.json
[其中前面的信息是ip地址和端口号,用户名和密码,还有隶属于哪个逻辑库。-d表示逻辑库集合,-c表示集合,-f可写可不写,写的话表示里面的需要存放的记录,-o表示存储位置]
2.导入集合数据
》mongoimport
命令可以把JSON或者CSV文件的数据导入到某个集合中
mongoimport --host=localhost --port=27017 -u admin -p abc123456 --authenticationDatabase=admin -d school -c student --file D:/student.json
[- -file表示指定导入文件的位置]
3.导出逻辑库数据
》mongodump
命令可以导出逻辑库的数据
mongodump --host=localhost --port=27017 -u admin -p abc123456 --authenticationDatabase=admin -d school -o D:/
[-o后面不用写具体导出的文件名,该命令会自动将文件导出存放在D盘中的school(就是-d所存放的逻辑库名称)文件夹中。并且还会将索引的信息也额外存放(而导出集合数据的方法却不会导出索引的信息!!!)]
4.导入逻辑库数据
》mongorestore
命令可以把导出的数据导入到逻辑库中
mongodump --host=localhost --port=27017 -u admin -p abc123456 --authenticationDatabase=admin --drop -d school D:/school
[其中- -drop表示删除原来的数据库再做导入操作,也可以不写该参数]