mongoDB数据库的常用命令:
1.查看当前的数据库:db
2.查看所有的数据库: show databases/show dbs
3.切换数据库: use db_name
4.删除当前的数据库:需要先切换进去,再db.dropDatabase()
5.创建集合(表)的命令
(1)手动创建:db.createCollection("tb_table_name")
db.createCollection("sub",{capped:true,size:10})
参数capped:默认值为false表示不设置上限,
参数size:当capped值为true时,需指定此参数,表示上限大小,会将之前的数据覆盖。
(2)不手动创建:第一次向不存在的集合中加入数据时,集合会被创建出来
6.查看集合:show collections/show tables
7.删除集合:db.集合名.drop()
8.集合增加数据:
db.tb_stu.insert({_id:2,username:"小花",gender:true})
db.tb_stu.insert({_id:3,username:"小黑",gender:false})
db.tb_stu.insert({_id:4,username:"大头儿子",gender:true})
db.tb_stu.insert({_id:5,username:"小头爸爸",gender:false})
db.tb_stu.insert({_id:6,username:"红花会",gender:false})
9.db.tb_stu.find() 查询所有数据
10.删除集合中的数据
1.默认删除所有符合条件的数据
db.tb_stu.remove({gender:false})
2.只删除符合条件的一个数据
db.tb_stu.remove({gender:false},{justOne:true})
3.删除所有的数据 (必须传递一个参数,可以传递一个空字典)
db.tb_stu.remove({})
11.修改集合中的数据
1.db.tb_stu.update({条件},{修改的数据}) (一般不用)
db.tb_stu.update({_id:2},{username:"小明"}) 但是修改后只剩名字了,原来其它的数据如age,gender都被删除了
因此,一般不用。
2.使用$set修改,保存原来的数据
db.tb_stu.update({_id:2},{$set:{username:"花花"}})
3.修改所有符合条件的数据 加multi:true
db.tb_stu.update({gender:false},{$set:{age:28}},{multi:true})
4.删除数据中的某一字段
db.tb_stu.update({gender:false},{$unset:{username:""}})
12.集合中数据的查询
1.查询所有的数据 可以传一个空字典
db.tb_stu.find()/find({})
db.tb_stu.find().pretty()格式化输出数据
执行下列语句,直接建库建表:
db.stu.insert({_id:1,"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true })
db.stu.insert({_id:2,"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false })
db.stu.insert({_id:3,"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false })
db.stu.insert({_id:4,"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true })
db.stu.insert({_id:5,"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true })
db.stu.insert({_id:6,"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true })
db.stu.insert({_id:7,"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true })
db.stu.insert({_id:8,"name" : "Lily", "hometown" : "英国", "age" : 18, "gender" : false })
2.查询指定条件的数据(也是查询所有符合条件的数据)
db.stu.find({gender:true})
3.只查询符合条件的一个数据
db.stu.findOne({gender:true}) 由于只有一条数据 会自动格式化输出
4.条件运算 $lt(小于),$gt(大于),$lte(小于等于),$gte(大于等于),$ne(不等于)
//如:查询年龄大于20岁的人
db.stu.find({age:{$gt:20}})
5.逻辑运算 $and,$or
1.默认find的多条件,就是 $and
db.stu.find({gender:true,hometown:"桃花岛"})
db.stu.find({$and:[{gender:true},{hometown:"桃花岛"}]})
2.$or 来自大理或者是女生
db.stu.find({$or:[{gender:false},{hometown:"大理"}]})
3.混合使用
//如:来自桃花岛或者年龄小于45岁 必须是男生
db.stu.find({$and:[{$or:[{hometown:"桃花岛"},{age:{$lt:45}}],{gender:true}]})
4.范围运算符 $in,$nin
db.stu.find({hometown:{$in:["大理","蒙古"]}})
5.正则表达式
1./正则/
db.stu.find({name:/黄/})
2.$regex
db.stu.find({name:{$regex:"段"}})
不区分大小写
db.stu.find({name:/lily/i})
db.stu.find({name:{$regex:"lily",$options:"i"}})
6.自定义函数 $where
db.stu.find({$where:匿名函数带返回值})
//取年龄 大于29岁的人
db.stu.find({$where:function(){return this.age>20}}) 涉及到变量作用域,使用this
7.查询结果显示
1.skip 跳过几个
2.limit 限制显示的条数
db.stu.skip(2).limit(2)
db.stu.limit(2).skip(2)与上面结果一致,但效率没有上面高执行时会先检查skip(2),先执行
聚合查询:(管道有顺序)
db.stu.aggregate([管道1},{管道2}..])
$group分组:
1.按照gender性别分组
db.stu.aggregate([{$group:{_id:"$gender"}}]) (按单个分组没有太大实际意义)
添加push,可以看到name,放在列表中
db.stu.aggregate([{$group:{_id:"$gender",all_name:{$push:"$name"}}}])
2.表达式:(相当于聚合函数) $sum,$avg,$first,$last,$max,$min. $push
//按照性别分组 求年龄的平均值
db.stu.aggregate({$group:{_id:"$gender",avg_age:{"$avg":"$age"}}})
//按照籍贯分组 求年龄和
db.stu.aggregate({$group:{_id:"hometown",avg_age:{"$avg":"$age"}}})
$match:查找符合条件的数据
//与find查询功能一样,match可以配合管道使用
//取出年龄大于20人
db.stu.aggregate({$match:{age:{$gt:20}}})
//取出年龄小于40的,按照性别分别求年龄平均值
db.stu.aggregate({$match:{age:{$lt:40}}},{$group:{_id:"$gender",avg_age:{$avg:"$age"}}})
project:投影取出部分字段:
//取出年龄大于20;按照籍贯分组 求出年龄之和,求年龄平均值;查看的时候只想看到之和。
db.stu.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$hometown",age_sum:{$sum:"$age"},age_avg:{$avg:"$age"}}})
//想要显示的字段设置为1,在aggregate中添加一个管道如下
,{$project:{age_sum:1}}
$sort:排序:1升序 -1降序
//先找45以下,再按籍贯分组 求平均值之和,再降序,再投影。
db.stu.aggregate({$match:{age:{$lt:45}}},{$group:{_id:"$hometown",age_avg:{$avg:"$age"},last_sum:{$last:"$age"}}},{$sort:{age_avg:-1}},{$project:{age_avg:-1}})
//注意:管道是有顺序的,不能进行随意颠倒;
$skip 跳过几个查看 $limit 允许显示几个
//先跳过两个 再显示4个
db.stu.aggregate({$skip:2},{$limit:4})
db.stu.aggregate({$limit:4},{$skip:2})
$unwind:将数据列表 分割 拆分
//按照性别分组,求出所有人的名字 $push
db.stu.aggregate({$group:{_id:"gender",all_name_list:{$push:"$name"}}},{$unwind:"$all_name_list"})
MongoDB的索引操作
1.创建批量的数据 20w
for (var index = 0;index < 200000;index++){
db.stu.insert({_id:index,name:"name"+index,age:index})
}
2.查看数据的时间 对比 毫秒
db.xx.find().explain('executionsStats')
2.1查看_id "executionTimeMillis" : 0, 显示0表示不足1毫秒
db.stu.find({_id:18888}).explain('executionStats')
2.2查看 name "executionTimeMillis" : 103,
db.stu.find({name:"name188888"}).explain('executionStats')
3.设置ID索引ensureIndex
db.stu.ensureIndex({name:1})
4.删除索引
db.stu.dropIndex('name_1')
5.查看创建的索引
db.stu.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.stu"
},
{
"v" : 2,
"key" : {
"name" : 1
},
"name" : "name_1",
"ns" : "test.stu"
}
]
再进行查询name,显示 "executionTimeMill is" : 0
MongoDB的备份和恢复
mongodump -h 127.0.0.1:27017 -d stu -o /home/python/Desktop/mongodata
备份:mongodump -h -d -o
-h host "IP:port"
-d:备份的数据库名字 db
-o:备份到哪
恢复:mongorestore -h 127.0.0.1:27017 -d newstu --dir /home/python/Desktop/mongodata/stu
-h:host
-d:恢复的数据的名字
--dir:从哪里恢复
10.数据的导出和导入
mongoexport -h dbhost -d dbname -c colname -o filename --type json/csv -f field
-h:服务器地址
-d:数据库名
-c:集合名(表)
-o:导出文件名
--type:文件类型,默认json格式,可选数据类型json,csv
-f:需要导出的字段,导出为json格式的数据时可以不指定导出哪些字段,默认全部,导出成csv文件
例如:mongoexport -h "127.0.0.1:27017" -d stu -c col1 -o test1_col1
mongoexport -h 127.0.0.1:27017 -d newstu -c stu -o data.json
导入
mongoimport -d dbname -c collectionname --file filename --headerline --type
-d:数据库名
-c:集合名(表)
-o:导出文件名
--type:文件类型,默认json格式,可选数据类型json,csv
-f:导入的字段名
--headerline:如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
--file:要导入的文件
mongoimport -d newstu -c student_csv --file data.csv --headerline --type
mongodb中常见数据类型
Object ID: 文档ID (可以⾃⼰去设置_id插⼊⽂档,如果没有提供, 那么MongoDB为每个文档提供了一个独特的_id, 类型为objectID)
String: 字符串, 最常⽤, 必须是有效的UTF-8
Boolean: 存储⼀个布尔值, true或false
Integer: 整数可以是32位或64位, 这取决于服务器
Double: 存储浮点值
Arrays: 数组或列表, 多个值存储到⼀个键
Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
Null: 存储Null值
Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
Date: 存储当前⽇期或时间的UNIX时间格式