mongodb基本指令与高级查询指令以及聚合命令
一、MongoDB中关于database的基本指令
1 ###关于database的基本指令 2 #查询当前使用的数据库指令 3 db 4 5 #查询所有的数据库指令 6 show dbs#或者:show databases 7 8 #切换数据库指令 9 use db_name 10 11 #删除当前数据库指令 12 db.dropDatabase()
二、MongoDB中关于集合的创建及基本增删改查指令
1、集合创建(集合相当于mysql里的表)
1 ###不手动创建集合 2 #向不存在的集合中第一次加入数据时,集合会被创建出来 3 4 ###手动创建集合 5 db.createCollection(name,options) 6 7 #例如创建集合test 8 db.createCollection(test) 9 10 db.createCollection(test,{capped:true,size:10}) 11 #参数capped:默认值为false表示不设置上限,值为true表示设置上限;参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节 12 13 #查看集合 14 show collections 15 16 #删除集合 17 db.collection_name.drop()
2.集合中的数据类型
1、Object ID :文档ID
2、String:字符串,最常用,必须是有效的UTF-8
3、Boolean:存储一个布尔值,True或false
4、integer:整数可以是32位或64位,取决于服务器
5、Double:存储浮点值
6、Arrays:数据或列表,多个值存储到一个键
7、Object:用于嵌入式的文档,即一个值为一个文档
8、Null:存储Null值
9、Timestamp:时间戳,表示从1970-1-1到现在的总秒数
10、Date:存储当前日期或时间的UNIX时间格式
注:每个文档都有一个属性,为_id,保证每个文档的唯一性,
可以自己去设置_id插入文档,如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为Object ID
Object ID是一个12字节的十六进制数:
前4个字节为当前时间戳
接下来3个字节为机器ID
接下来的2个字节为MongoDB的服务器进程id
最后3个字节为简单的增量值
创建日期语句如下:参数的格式为YYYY-MM-DD,具体指令为:
new Date("2017-12-20")
3、插入数据
插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的Objectid
1 db.collection_name.insert(document) 2 3 db.test.insert({name:"gi",gender:1})#向test集合插入数据{name:"gi",gender:1} 4 5 db.test.insert({_id:"20181125",name:"gi",gender:1})#向test集合插入数据{_id:"20181125"name:"gi",gender:1}
1 ###Mong0DB插入数据 2 db.collection.insert({})#插入数据,“_id”存在就报错 3 db.collection.save({})#插入数据,如果文档的“_id”存在就会更新数据,如果文档的“_id”不存在则添加数据
4、删除数据
db.集合名称.remove(<query>,{justOne:<boolean>})
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为True或1,则只删除一条,默认false,表示删除多条
1 ###MongDB删除数据 2 db.test.remove({name:"xiaowang"},{justOne:true}) 3 #默认情况会删除所有满足条件的数据,{justOne:true}能达到只删除一条的效果
5、更新数据
指令:db.集合名称。update(<query>,<update>,{multi:<boolean>})
参数query:查询条件
参数update:更新操作符
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为True表示把所有满足条件的文档全部更新。
注意:“multi update only works with $ operators”(multi 只和$一起使用)
1 ###MongoDB更新数据 2 db.test.update({name:"xiaoming"},{name:"xiaozhang"}) 3 #把名字为xiaoming的数据替换为{name:"xiaozhang"},注意此时是整条数据被替换成{name:"xiaozhang"} 4 5 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}}) 6 #把name为xiaoming的数据name值更新为xiaozhang,注意此时只是这条数据的name被更新了,其他不变,且只更新数据集中的符合条件的第一条数据 7 8 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}},{multi:true}) 9 #{multi:true}可以达到更新多条数据的目的
6、查询数据
1、方法find():查询
db.集合名称.find({条件文档})
2、方法findOne():查询,只返回第一个
db.集合名称.findOne({条件文档})
3、方法pretty():将结果格式化
db.集合名称.find({条件文档}).pretty()
7、高级查询
1、比较运算符
等于:默认是等于判断,没有运算符
小于:$it (less than)
小于等于:$ite (less than equal)
大于:$gt (greater than)
大于等于:$gte (greater than equal)
不等于:$ne
db.test.find({age:{$gte:18}}) #test中年龄大于等于18的记录
2.范围运算符
使用“$in”,"$nin"判断是否在某个范围内
db.test.find({age:{$in:[18,28,38]}}) #查询年龄为18,28,28的test中的记录
3、逻辑运算符
and:在json中写多个条件即可
db.test.find({age:{$gte:18},gender:true}) #查询年龄大于或等于18,并且性别为true的学生
or:使用$or,值为数组,数组中每个元素为json
db.test.find({$or:[{age:{$gt:18}},{gender:false}]}) #查询年龄大于18,或性别为false的学生
db.test.find({$or:[{age:{$gte:18}},{gender:true}],name:"gi"}) #查询年龄大于18或性别为男生,并且姓名为“gi”
4、正则表达式
使用//或$regex编写正则表达式
db.test.find({sku:/^abc/}) #sku标签中以abc开头的记录 db.test.find({sku:{$regex:"789$"}}) #sku标签中以789$结尾的记录
5、limit和skip
方法limit():用于读取指定数量的文档
db.集合名称.find().limit(NUMBER)
db.test.find().limit(2) #查询test集合中的前两条记录
方法skip():用于跳过指定数量的文档
db.集合名称.find().skip(NUMBER)
db.test.find().skip(2) #跳过test集合中的前两条数据,
同时使用skip和limit(可实现翻页功能)(一般先使用skip,再使用limit,这样效率高)
db.test.find().skip(2).limit(2) db.test.find().limit(3).skip(2)
6、自定义查询
使用$where后面写一个函数,返回满足条件的数据
#查询年龄大于30 的学生 db.test.find({$where:function(){return this.age>30;}})
7、投影
在查询到的返回结果中,只选择必要的字段
db.集合名称。find({},{字段名称:1,...})
参数为字段与值,值为1表示显示,值为0表示不显示
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
#test输出只显示name列和gender列 db.test.find({},{_id:0,name:1,gender:1})
8、排序
方法sort(),用于对集合进行排序
db.集合名称.find().sort({字段:1,...})
参数1为升序排列
参数-1为降序排列
#根据性别降序,在根据年龄升序 db.test.find().sort({gender:-1,age:1})
9、统计个数
方法count()用于统计结果集中文档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.test.find({gender:true}).count() db.test.count({age:{$gt:20},gender:true})
10、消除重复
方法distinct()对数据进行去重
db.集合名称.distinct("去重字段":{条件})
db.test.distinct("hometown",{age:{$gt:18}})
8、聚合
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤、等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称。aggregate({管道:{表达式}})
常用管道:
在MongoDB中,文档处理完毕后,通过管道进行下一次处理,常用管道如下:
$group:将集合中的文档分组,可以用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输出文档排序后输出
$limit:限制聚合管道返回的文档书数
$skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数组类型的字段进行拆分
表达式
处理输入文档并输出
语法:表达式:“$列名”
常用表达式
$ sum:计算总和,$sum:1表示以一倍计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
$group对应的字典中有几个键,结果中就有几个键
分组依据需要放在_id后面
取不同的字段的值需要使用$,"$age"、“$gender”
取字典嵌套的字典中的值的时候“$_id.country”
能够同时按照多个建进行分组“{$group:{_id:{country:$country,province:"$province"}}}”
结果是:{_id:{country:"",province:""}}
#统计男生、女生总人数 db.test.aggregate({¥group:{_id:"$gender",counter:{$sum:1}}})
#Group by null #将所有文档分为一组 #求学生总人数、平均年龄 db.test.aggregate({$group:{_id:null,counter:{$sum:1},avgAge:{$avg:"$age"}}})
$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.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},aug_age:{$avg:$age}}},{$project:{gender:"$_id",count:"$count",avg_age:"$avg_age"}})
$match:过滤数据,只输出符合条件的文档
#查询年龄大于20 的学生 db.test.aggregate({$match:{age:{$gt:20}}})
#查询年龄大于20 的男生、女生人数 db.test.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$gender",counter:{$sum:1}}})
$sort:将输出文档排序后输出
#查询学生信息,按年龄升序 db.stu.aggregate({$sort:{age:1}})
#查询男生和女生人数,按人数的降序排序 db.stu.aggregate({$group:{_id:"gender",count:{$sum:1}}},{$sort:{count:-1}})
$limit:限制聚合管道返回的文档书数
#显示前两条记录 db.test.aggregate({$limit:2})
$skip:跳过指定数量的文档,并返回余下的文档(一般先使用skip,再使用limit)
#跳过指定2条数量记录 db.test.aggregate({$skip:2})
$unwind:将数组类型的字段进行拆分
db.集合名称.aggregate({$unwind:"$字段名称"})
db.test.insert({_id:1,item:"t-shirt",size:["S","M","L"]}) db.test.aggregate({$unwind:"$size"})
结果如下:
{“_id”:1,"item":"t-shirt","size":"S"}
{“_id”:1,"item":"t-shirt","size":"M"}
{“_id”:1,"item":"t-shirt","size":"L"}
属性perserveNullAndEmptyArrays,值为false表示丢弃属性值为空的文档
属性perserveNullAndEmptyArrays,值为true表示保留属性值为空的文档
用法:db.test.aggregate({$unwind:{path:"$size",perserveNullAndEmptyArrays:true}})
#perserveNullAndEmptyArrays:true #防止数据丢失