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 #防止数据丢失

原文地址:https://www.cnblogs.com/zhiliang9408/p/10013958.html