前期:
启动:sudo service mongod start
停止:sudo service mongond stop
重启:sudo service mongod restart
查看是否启动成功:ps ajx|grep mongod
配置文件的位置: /etc/mongod.conf
默认端口:27017
日志的位置:/var/log/mongodb/mongod.log
基础命令:
查看当前的数据库:db 查看所有的数据库:show dbs / show databases 切换数据库:use db_name 删除当前的数据库:db.dropDatabase()
数据类型:
Object ID: 文档ID String: 字符串,必须是有效的UTF-8 Boolean: 存储一个布尔值,true或false Integer: 整数可以是32位或64位,取决于服务器 Double: 存储浮点值 Arrays: 数组或列表, 多个值存储到一个键 Object: 用户嵌入式的文档,即一个值唯一个文档 Null: 存储Null值 TimesTamp: 时间戳 Data: 存储当期日期或时间的UNIX时间格式
注意点:
创建日期语句如下:参数的格式为YYYY-MM-DD。eg: new Data("2017-12-20")
每个文档都有一个属性,为_id, 保证每个文档的唯一性,也可以自己设置_id插入文档,如果没有提供,那么MongDB为每一个文档提供一个独特_id,类型为ObjectID。
objectID是一个12字节的十六进制数:
前4个字节为当前时间戳
接下来3个字节的机器ID
接下来的2个字节中MongoDB的服务进程id
最后3个字节是简单的增量值
mongodb中没有表的概念,集合相当于MySQL中的表。集合不用手动创建,向不存在的集合中第一次加入数据时,集合会被创建出来。
手动创建集合:
db.createCollention("sub",{capped:true, size:10})
“sub”为集合名。
参数capped: 默认值为false表示不设置上限,值为true表示设置上限。
参数size: 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节。
查看集合:show collections
删除集合:db.集合名称.drop(), eg: db.sub.drop()
保存集合:db.集合名称.save()
mongodb插入数据:
db.collection.insert({})插入数据,_id 存在就报错。
db.collection.save({})插入数据,_id存在会更新。
eg:
db.test.insert({"name":"xiaoming","age":10}) # test中插入一条数据
mongodb更新操作:
db.test.update({name:"xiaoming"},{name:"xiaozhao"}) #把name为xiaoming的数据替换为{name:"xiaozhao"}
db.test.update({name:"xiaoming"},{$set:{name:"xiaozhao"}}) # 把name为xiaoming的数据替换为{name:"xiaozhao"}
db.test.update({name:"xiaoming"},{$set:{name:"xiaozhao"}},{multi:true}) #把name为xiaoming的数据全替换为{name:"xiaozhao"}
{multi:true}达到更新多条的目的
mongodb删除
db.test.remove({name:"xiaohong"},{justOne:true}) #默认会删除满足条件的所有数据,{justOne:true}能达到只删除一条的效果。
mongodb查询
find(): 查询
db.集合名称.find({条件文档})
findOne(): 查询,只返回第一个
db.集合名称.findOne({条件文档})
pretty(): 将结果格式化
db.集合名称.find({条件文档}).pretty()
自定义查询:使用$where后面写一个函数,返回满足条件的数据。
eg: 查询年龄大于30的学生 db.stu.find({ $where:function(){ return this.age>30;} })
注意:在查询结果中,可以只返回自己所需的字段
db.集合名称.find({},{字段名称:1}) eg: db.stu.find({},{_id:0,name:1,gender:1}) # 显示name,gender字段
除_id字段,其他字段不显示 就不写,_id字段默认显示,_id:0:表示不显示。
比较运算符
等于:默认是等于判断,没有运算符
小于:$lt (less than)
小于等于: $lte (less than equal)
大于:$gt (greater than)
不等于: $ne
eg:
db.test.find(age:{$age:18}) # 查询年龄为18的数据
范围运算符:
$in 在某个范围内,$nin 不在某个范围内。
eg:
db.test.find({age:{$in:[18,28,38]}}) # 查询年龄为18,28,38的数据。
逻辑运算符:
and:在json中写多个条件即可。
db.test.find({age:{$gte:18},gender:true}) # 查询年龄大于或等于18,并且性别为true的数据
or:使用$or,值为数组,数组中每个元素为json
db.test.find({$or:[{age:{$gte:18},{gender:true}}],name:"xiaohong"}) # 查询年龄大于或等于18或性别为true,并且姓名为“xiaohong”的数据
支持正则表达式:使用//或$regex编写正则表达式
eg:查找姓名以“ming”结尾的数据
db.stu.find({name:{$regex:"ming$"}})
db.stu.find({name:{$regex:/ming$/}})
函数:
limit():用于读取指定数量的文档
eg: 查询2条学生的信息 db.stu.find().limit(2)
skip(): 用于跳过指定数量的文档
eg: 跳过前两个学生信息 db.stu.find().skip(2)
# 同时使用limit()与skip()
db.stu.find().skip(5).limit(4) # 查询6-9这四个学生的数据
sort(): 用于对集合进行排序
db.集合名称.find().sort({字段:1,...}) #参数1位升序,-1为降序。 eg: 根据性别降序,再根据年龄升序 db.stu.find().sort({gender:-1,age:1})
count(): 用于统计结果个数
db.集合名称.find({条件}).count() eg: db.stu.find({gender:true}).count() db.集合名称.count({条件}) eg: db.stu.count({gender:true})
distinct() 对数据进行去重
db.集合名称.distinct("去重字段", {条件}) eg: db.stu.distinct("hometown",{age:{$gt:18}}) #年龄大于18岁的学生都来在于哪个家乡
数据的备份与恢复:
备份:mongodump -h dbhost -d dbname -o dbdirectry
-h: 服务器地址,也可以指定端口号
-d: 需要备份的数据库名称
-o: 备份数据的存放位置
eg: mongodump -h 192.55.63.88:27017 -d test -o ~/Desktop/testbak
数据恢复:
mongorestore -h dbhost -d dbname --dir dbdirectory
-h: 服务器地址
-d: 需要恢复的数据库实例
--dir: 备份数据所在的位置
eg: mongorestore -h 192.55.63.88:27017 -d test1 --dir ~/Desktop/testbak/test
聚合aggregate
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个有多个阶段 (stage)组成的管道,可以对每个阶段的管道进行
分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
在mongodb中,文档处理完毕后,通过管道进行下一次处理。常用管道如下:
$group: 将集合中的文档分组,可用于统计结果
$match: 过滤数据,只输出符合条件的文档
$project: 修改文档的结构,如重命名、增加、删除字段、创建计算结果
$sort: 将输出文档排序后输出
$limit: 限制聚合管道返回的文档数
$skip: 跳过指定数量的文档,并返回余下的文档
$unwind: 将数组类型的字段进行拆分
注意:$group 对应的字典中有几个键,结果中就有几个键;分组依据需要放到'_id'后面;取不同的字段值需要使用$,'$age','$gender';取字典嵌套的字典中的值的时候‘$_id.country’
常用表达式: (语法:表达式:'$ 列名')
$sum: 计算总和,$sum:1表示以一倍计数
$ avg: 计算平均值
$min: 获取最小值
$max: 获取最大值
$push: 在结果文档中插入值到一个数组中
$first: 根据资源文档的排序获取第一个文档数据
$last: 根据资源文档的排序获取最后一个文档数据
eg1: 按gender进行分组,获取不同组的数量与平均年龄 db.stu.aggregate({$group:{_id:"$gender",cpunt:{$sum:1},avg_age:{$avg:"age"}}}) eg2: 按照hometown进行分组,获取不同组的平均年龄 db.stu.aggregate({$group:{_id:"hometown",mean_age:{$avg:"$age"}}})
group by null 将集合中所有文档分为一组。
eg: 求学生总人数、平均年龄 db.stu.aggregate({$group:{_id:null,counter:{$sum:1},avg_age:{$avg:'$age'}}})
$project: 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果。
eg: 查询男生、女生人数,输出人数 db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}}{$project:{_id:0,counter:1}})
$match 用于过滤数据,只输出符合条件的文档 (match 是管道命令,能将结果交给后一个管道,但是find不可以)
eg: 查询年龄大于20的男生、女生人数 db.stu.aggregate({$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}})
$sort 将输入文档排序后输出
eg: 查询男生、女生人数,按人数降序排列 db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}})
$limit限制聚合管道返回的文档数
eg:查询2条学生信息 db.stu.aggregate({$limit:2})
$skip 跳过指定数量的文档,并返回余下的文档
eg: 统计男生、女生人数,按人数升序,取出第二条数据 db.stu.aggregate({$grop:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:1}},{$skip:1},{$limit:1})
注意:先写skip,再写limit
$unwind 将一个文档中的某一个数组类型字段拆分为多条,每一条包含数组中的一个值
eg: db.t2.insert({_id:1,item:'T-shirt',size:['S','M','L']}) db.t2.aggregate({$unwind:'$size'}) 输出: {"_id":1,"item":'T-shirt',"size":'S'} {"_id":1,"item":'T-shirt',"size":'M'} {"_id":1,"item":'T-shirt',"size":'L'}
db.集合名称.aggregate({$unwind:{patrh:"$字段名称",preserveNillAndEmptyArrays:<boolean>}})
preserveNillAndEmptyArrays为true时,保留属性值为空的文档。
索引:提升查询速度(默认情况下索引字段的值可以相同)
语法:db.集合名称.ensureIndex({属性:1}),1表示升序,-1表示降序
创建唯一索引(索引值唯一):
db.t1.ensureIndex({"name":1},{"unique":true})
创建联合索引:
db.t1.ensureIndex({name:1,age:1})
查看当前集合的所有索引:
db.t1.getIndexes()
删除索引:
db.t1.dropIndex({'索引名称':1})