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类型字符串

mongodb客户端是持久连接吗_python

查询记录

》find函数可以从集合中提取记录,参数为查询条件

mongodb客户端是持久连接吗_数据_02

表达式

》MongoDB的表达式必须写成JSON格式

一:

mongodb客户端是持久连接吗_数据_03

use school
/*
db.student.find({
    age:{$gte:20,$lte:30}
})
db.student.find(
    city:{$nin:["北京","上海"]}
})
*/
db.student.find({name:{$ne:"小明"}})

二:

mongodb客户端是持久连接吗_mongodb_04

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()方法可以实现分页查询
修改记录

1update()和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”命名的索引文件

mongodb客户端是持久连接吗_数据_05


如图,使用该命令删除索引,会在表的索引下方删除该索引

mongodb客户端是持久连接吗_逻辑库_06


如图,使用该命令创建非阻塞索引,并且传入name属性将索引名称更改为“name”

mongodb客户端是持久连接吗_mongodb_07


如图,使用该命令可以查看索引的内容

mongodb客户端是持久连接吗_mongodb_08

3.唯一性索引

》唯一性索引只能创建在每个记录都含有的公共字段上,在非公共字段上不能创建唯一性索引的。

写法:db.collection.createIndex({key:1},{unique:true})

[unique为true表示唯一性,key字段需要在表中所有的表信息都有该key字段,且该key字段的值唯一,才能创建成功,否则会报错]

如图:注释部分就是创建了唯一索引;而后面一句往表中插入该数据则会报错(因为该sid=8001的值已存在,不能再被创建成功)!!!

mongodb客户端是持久连接吗_逻辑库_09

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表示删除原来的数据库再做导入操作,也可以不写该参数]