mongodb的基本操作

创建

use 集合名称  创建数据库
show dbs  查看数据库
db.集合名称.find()   把集合导入数据库中

插入

db.集合名称.insert(document)
db.collecion.insert({}) _id存在就会报错
db.collecion.insert({_id:"", })插入文档时,如果不指定_id参数,mongodb会为文档分配一个唯一的objectId 
db.collecion.save({}) _id存在会更新

更新

1.db.集合名称.update(<query>,<update>,{multi:<boolean>})
2.db.集合名称.update({name:"laowang"},{name:"xiaowang"})   把name为laowang的数据替换成xiaowang
3.db.集合名词.update({name:"老王"},{$set:{name:"隔壁老王"}})   把name为 老王 的数据name的值更新为 隔壁老王
4.multi:true  达到更新多条数据的目的  与$一起配合使用
5.db.集合名称.replaceOne({name:""},{$set:{address:""})   向集合中的name的值为文档,添加一个address属性或其他属性

# $push 用于向数组z中添加一个新的元素
# $addToSet 向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加成功
6.db.集合m名称.update({key:value},{$push:{"hobby.movies":"Interstellar"}});
7.db.集合m名称.update({key:value},{$addToSet:{"hobby.movies":"Interstellar"}});

删除

1.db.集合名称.remove({name:"laowang"},{justOne:true});
默认情况会删除所有满足条件的数据,'{justOne:true}'能达到只删除一条的效果
2.db.集合名称.remove({});
3.db.集合名称.drop();

查询

1.db.集合名称.find()   查询该集合的所有数据
2.db.集合名称.find({key:value}) 查询该集合中对应key的数据
3.db.集合名称.findOne({key:value}) 查询该集合中对应key的一条数据
4.db.集合名称.find({key:value}).pretty()  pretty()达到输出美化效果
# 结合比较运算符查询:
1.等于:默认是等于判断,没有运算符
2.db.集合名称.find({key:{$lte:value}}) 查询key小于等于value的数据
3.db.集合名称.find({key:{$lt:value}}) 查询key小于value的数据
4.db.集合名称.find({key:{$gt:value}}) 查询key大于value的数据
5.db.集合名称.find({key:{$gte:value}}) 查询key大于等于value的数据
6.db.集合名称.find({key:{$ne:value}}) 查询key不等于value的数据
# 范围运算符:
1.db.集合名称.find({key:{$in:[]}}) 查询key在[]的数据
2.db.集合名称.find({key:value,key:value}}) and查询
3.db.集合名称.find({$or:[{key:value},{key:value}]})  or查询
4.db.集合名称.find({$or:[{key:{$:value}},{key:{$in:[]}}]})  or查询结合范围查询以及条件查询
# 使用正则表达式
使用//或$regex编写正则表达式
1.db.集合名称.find({key:/^/})
2.db.集合名称.find({key:{$regex:"$"}})
limit读取指定数量的文档&skip跳过指定数量的文档
1.db.集合名称.find().limit(number) 
2.db.集合名称.find().skip(number)
3.db.集合名称.find().limit(number).skip(number)/db.集合名称.find().skip(number).limit(number)
# 自定义查询
1.db.集合名称.find({$where:function(){return 条件}})
# 投影 参数为字段与值,值为1表示显示,为0不显示,_idlie默认是显示的,如果不需要显示需要设置为0
1.db.集合名称.find({_id:0, name:1,gender:1})
2.db.集合名称.find().sort({key:1}) 该集合以key为标准进行升序排序   降序key:-1
3.db.集合名称.find({},{key:value}) 只查询输出key
# 统计数量
1.db.集合名称.find().count()  
2.db.集合名称.find({条件}).count()  
# 去重 distinct()
1.db.集合名称.distinct("去重字段",{条件})
# 聚合 aggregate
1.db.集合名称.aggregate({管道:{表达式}})
2.db.orders.aggregate({$match:{}}
常用管道:
$group 分组   group by null  ---> _id:null
 1.分组依据要放在_id后面
 2.取不同字段的值需要使用$, '$age' 
 3.取字典嵌套的字典中的值的时候'$_id.country'
 4.能够同时按照多个键进行分组'{$group:{_id:{country:"$country",province:"$province"}}}'结果是'{_id:{country:"",province:""}}'                    
$match 过滤  能够把结果交给下一个管道,而find不行
# 选择年龄大于18的学生,观察男女各有几人
db.stu.aggregate({$match:{age:{$gt:18}}},{$group:{_id:"$gender",count:{$sum:1}}},{$project:{_id:0,gender:"$_id",count:1}})
$project  修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
# 查询学生姓名、年龄
db.stu.aggregate({$project:{_id:0,name:1,age:1}})
# 查询男生、女生人数,输出人数
 db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}) 
db.tv.aggregate(
{$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
{$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
{$project:{country:"$_id.country",province:"$_id.province",count:1,_id:0}})                    
$sort 排序 
# 查询学生信息,按年龄升序                  
db.stu.aggregate({$sort:{age:1}})  
# 查询男生、女生人数,按人数降序
db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}})                   
$limit 限制聚合管道返回的文档数
$skip 跳过指定数量的文档,返回剩下的文档
$unwind 讲数组类型字段进行拆分               db.stu.aggregate({$unwind:"$size"}) 
# 练习  统计tags的长度
db.t2.aggregate({$match:{username:"alex"}},{$unwind:"$tags"},{$group:{_id:null,sun:{$sum:1}}})  输出结果:{"_id":null,"sum":3}  
## preserveNullAndEmptyArrays值为true表示保留属性值为空的文档
db.tv.aggregate({$unwind:{path:"$size",preserveNullAndEmptyArrays:true}})                    
# 索引
# 插入上十万条数据
for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}  
# 查看是否插入成功
db.t255.find().count()
# 查看查询速度                    
db.t255.find({name:"test100000"}).explain("executionStats") 
# 加入索引,再查看查询速度
db.t255.ensureIndex({name:1})  
db.t255.find({name:"test100000"}).explain("executionStats") 
# 创建唯一索引 {"unique":true}  
# 建立联合索引(需要多个字段来判断唯一性的时候需要建立联合索引) db.t1.ensureIndex({name:1,age:1}) 
查看当前集合的所有索引  db.t1.getIndexes()
# 删除索引 
db.t1.dropIndex("索引名称") 
### 查询分析:hint、explain                  
# hint()强制mongodb使用一个指定的索引,某些情形下会提升性能-->一个有索引的集合并且执行一个多字段的查询
db.users.find({gender:"m"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
# explain
db.users.find({gender:"m"},{user_name:1,_id:0}).hint({gender:1,user_name:1})explain()
# 数据备份和恢复
# 备份:
mongodump -h dbhost -d dbname -o dbdirectory
mongodump -h 172.16.165.135:27017 -d test -o ~/Desktop/testbak
# 恢复
mongodump -h dbhost -d dbname --dir dbdirectory
mongodump -h 172.16.165.135:27017 -d test2 --dir ~/Desktop/testbak/test1   

原子操作常用命令

1.$set 用来指定一个键并更新键,键不存在就创建
2.$unset 删除一个键
3.$inc 多文档的某个值为数字型,只能为满足要求的数字的键进行增减的操作
4.$push 一次可以追加一个值到一个数组字段内
5.$pushAll 一次可以追加对个值到一个数组字段内
6.$pull 从数组文档内删除一个等于value的值
7.$addToSet 增加一个值到数组内,只有这个值不再数组内才增加
8.$pop 删除数组的第一个或最后一个元素
9.$rename 修改字段名称
10.$bit 位操作,integer类型
11.偏移操作符

表达式 ‘$列名’

1.$sum:计算总和,$sum:1表示以一倍计数
2.$avg:计算平均值
3.$min:计算最小值
4.$max:计算最大值
5.$push:在结果文档中插入值到一个数组中
6.$first
7.$last 

固定集合

# 创建固定集合 createCollection创建固定集合,并且capped选项设置为true
db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
# 判断是否为固定集合
db.cappedLogCollection.isCapped()
# 将已存在的集合转换成固定集合
db.runCommand({"convertToCapped":"posts",size:10000})
# 固定集合文档按照插入顺序储存的,默认情况下查询就是按照插入顺序返回的,也可以使用$natural调整返回顺序
db.cappedLogCollection.find().sort({$natural:-1})
# 固定集合的功能特点
可以插入及更新,但更新不能超出collection的大小,否则更新失败,不允许删除,但是可以调用drop()删除集合中的所有行,但是drop后需要显式地重建集合。

查询限制:

1.索引不能被正则表达式及非操作符(比如:$nin,$not等)
2.算术运算符,如$mod等 
3.$where 子句

你可能感兴趣的:(数据库)