Python—MongoDB进阶

MongoDB的进阶用法

一,limit

  • limit() : 用于读取指定数量的文档
    用法:
    db.集合名称.find().limit(number)
    例如:
    查询find查询到的数据的前两条
    db.集合名称.find().limit(2)

二,skip

  • skip() : 用于跳过指定数量的文档
    用法:
    db.集合名称.find().skip(number)
    例如:
    跳过find查到的数据的前两个,从第3个开始查询:
    db.集合名称.find().skip(2)

三,同时使用limit和skip

  • db.集合名称.find().skip(5).limit(4)
    这个的意思是跳过find()查询到的数据的前5条,从第6条开始查询,查询4条

四,投影

  • 在查询到的返回结果中,只选择必要的字段
    命令:
    db.集合名称.find({},{field : 1,…})
    这里说明一下 :
  • 参数为字段和值,值为1的时候表示显示该字段,为0的时候则不显示
  • 特别要注意 :对于_id 列默认是显示的,如果不显示需要明确设置为0
    例如:
    db.集合名称.find({},{_id : 0, 字段名 : 1, 字段名 :1})

五,排序

  • 方法 sort() ,用于对结果集进行排序
    db.集合名称.find().sort({字段: 1,…})
    说明:
  • 参数 1为升序排序,参数 -1 为降序排序+
    例如:
    根据gender降序,在根据age升序
    db.集合名称.find().sort({gender : -1 ,age : 1})

六,统计个数

  • 方法count()用于统计结果集中文档条数
    db.集合名称.find().count()
    例如:
    统计gender为true的有几个
    db.集合名称.find({gender : true}),count()

七,消除重复

  • 方法 distinct() 对数据进行去重
    db.集合名称.distinct(“去重的字段”, {条件})
    例如:
    查询所有不重复的hometown
    db.集合名称.distinct(“hometown”, {})

聚合操作

一,MongoDB的聚合是什么

  • 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
    语法:
    db.集合名字.aggregate({管道:{表达式}})
    在这里插入图片描述

二,常用管道

在MongoDB中,⽂档处理完毕后, 通过管道进⾏下⼀次处理 常用管道命令如下:

  • $match : 过滤数据,只输出符合条件的文档
  • $group : 将集合中的文档分组,可用于统计结果
  • $project : 修改输入文档的结构,如重命名,增加,删除字段,
  • $sort : 将输入文档排序后输出
  • $limit : 限制聚合管道返回的文档数
  • $skip : 跳过指定数量的文档,并返回余下的文档

三,$match的使用

$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match 操作可以把结果交给下一个管道处理,而find不行
示例:

  • 1,查询age为18的数据
    db.集合名称.aggregate({$match : {age:18} })

  • 2,查询age大于20的数据
    db.集合名称.aggregate({$match : {age : {"$gt" : 20} } })

四,$group的使用

1,按照某个字段进行分组

$group 是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
使用的格式:

{
  $group:
    {
      _id: <expression>, // Group By Expression
      <field1>: { <accumulator1> : <expression1> },
      ...
    }
 }

说明:

  • _id为必选字段,为被分组字段,可为空或null

  • accumulator为可选字段,其中可携带运算符使用:

2,常用的表达式

  • $sum : 计算总和,$sum:1表示以1倍计数
  • $avg : 计算平均值
  • $min : 获取最小值
  • $max: 获取最大值
  • $push : 在结果文档中插入值到一个数组中

示例:

db.集合名字.aggregate(
    {$group:
        {
            _id:"$gender",
            counter:{$sum:1}
        }
    }
)

这里要注意:

  • db.db_name.aggregate是语法,所有的管道命令都需要写在其中
  • _id 表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
  • $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数

3,group by null

当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
示例:

db.集合名字.aggregate(
    {$group:
        {
            _id:null,
            counter:{$sum:1}
        }
    }
)

这里注意:

  • _id:null 表示不指定分组的字段,即统计整个文档,此时获取的counter表示整个文档的个数

4,数据透视

正常情况在统计的不同性别的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放到一起,那么此时就可以理解为数据透视
示例 :

 db.集合名字.aggregate(
     {$group:
         {
             _id:null,
             name:{$push:"$name"}
         }
     }
 )
  • 使用 $$ROOT 可以将整个文档放入数组中
 db.集合名字.aggregate(
     {$group:
         {
             _id:null,
             name:{$push:"$$ROOT"}
         }
     }
 )

6,多次聚合

对于如下数据,需要统计出每个country/province下的userid的数量(同一个userid只统计一次)

# 插入数据
db.集合名字.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },
{  "country" : "china", "province" : "sh", "userid" : "b" },
{  "country" : "china", "province" : "sh", "userid" : "a" }, 
{  "country" : "china", "province" : "sh", "userid" : "c" }, 
{  "country" : "china", "province" : "bj", "userid" : "da" },  
{  "country" : "china", "province" : "bj", "userid" : "fa" }])
db.stu2.aggregate(
{$group:{_id:{country:"$country", province:"$province", userid:"$userid"}}},
{$group:{_id:null, counter:{$sum:1}}}
)

在这里插入图片描述

五,$project

1,使用

$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
示例:

# 插入数据
db.集合名字.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },
{  "country" : "china", "province" : "sh", "userid" : "b" },
{  "country" : "china", "province" : "sh", "userid" : "a" }, 
{  "country" : "china", "province" : "sh", "userid" : "c" }, 
{  "country" : "china", "province" : "bj", "userid" : "da" },  
{  "country" : "china", "province" : "bj", "userid" : "fa" }])
db.集合名字.aggregate(
  {$group:{_id:{"国家":'$country', "省份":'$province',userid:'$userid'}}},
  {$group:{_id:{"国家":'$_id.国家', "省份":'$_id.省份'},counter:{$sum:1}}},
  {$project:{_id:0, "国家":'$_id.国家', "省份":'$_id.省份', "数量":'$counter'}}
)

在这里插入图片描述

六,管道命令之$sort

$sort用于将输入的文档排序后输出

使用示例如下:

  • 1,查询学生信息,按照年龄升序
 db.stu.aggregate({$sort:{age:1}})
  • 2,查询男女人数,按照人数降序
 db.stu.aggregate(
     {$group:{_id:"$gender", counter:{$sum:1}}},
     {$sort:{counter:-1}}
 )

在这里插入图片描述

七,$skip 和 $limit

  • $limit 限制返回数据的条数
  • $skip 跳过指定的文档数,并返回剩下的文档数
  • 同时使用时先使用skip在使用limit

使用示例如下:

  • 1.查询2条学生信息
 db.stu.aggregate(
     {$limit:2}
 )
  • 2.查询从第3条开始的学生信息
 db.stu.aggregate(
     {$skip:2}
 )
  • 3.统计男女生人数,按照人数升序,返回第二条数据
 db.stu.aggregate(
     {$group:{_id:"$gender",counter:{$sum:1}}},
     {$sort:{counter:-1}},
     {$skip:1},
     {$limit:1}
 )

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值