python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南

1. 连接mongo

需要知道mongoDB的地址、端口、授权用户、授权密码。一般情况下,技术都会给到数据分析人员这些信息。

python没有安装模块pymongo模块的,在cmd里面,pip install pymongo 进行安装。(具体操作可以自行百度)

##导入连接mongo需要的模块

from pymongo import MongoClient

###连接数据库

client = MongoClient(地址, 端口)

####访问数据库授权

db_auth = client.admin ##哪个库,这里是admin这个库

db_auth.authenticate(授权用户, 授权密码)

2. 访问数据集合并且提取数据

提取数据基本代码框架如下面代码示例:

collect10=db2.decisionResultData ##选择某个某个数据集合进行访问

###这里选择decisionResultData数据集合(相当于mysql里面的数据表)进行访问

dt= collect10.find({}) ###选择访问数据集合的所有数据

df_decision=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

加入某些限制条件进行数据提取,在find字典里面进行条件设置。

dt= collect10.find({某些条件}) ###选择访问数据集合中符合某些条件的数据

df_decision=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

3. 数据筛选条件

a. 大于/小于/等于条件

使用方式为:类似python中的字典嵌套字典的形式进行条件设置。

大于等于某个值

dt=collect10.find({'age':{'$gte':12

}

}

) ####年龄大于等于12岁

df_decision=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

小于某个值,将上面代码中的 $gte 换为 $lt 即可

等于某个值,以字典形式传入值即可

dt=collect10.find({'age':12

}

) ####查询等于12岁的数据

df_decision=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

关于时间范围的特殊示例。

Mongo数据集合中,有的是没有储存时间的,为了选取一定时间范围内的数据,可以利用集合表中的_id来进行时间范围的选择。

【_id是一个ObjectId类型的主键,其前4个字节是UNIX时间戳 。】

如果需要选择大于某个时间点后面的数据,根据需要的时间,生成一个ObjectId,条件设置为_id 大于这个ObjectId即可。

代码示例:

def object_id_from_datetime(from_datetime=None,span_days=0,span_hours=0,span_minutes=0,span_seconds=0,span_weeks=0):

'''根据时间手动生成一个objectid,此id不作为存储使用'''

if not from_datetime:

from_datetime = datetime.datetime.now()

from_datetime = from_datetime + datetime.timedelta(days=span_days,hours=span_hours,minutes=span_minutes,weeks=span_weeks)

return ObjectId.from_datetime(generation_time=from_datetime)

begin_date = input('请输入开始日期,格式例如:2017-01-31 00:00:00 :')

begin_date=object_id_from_datetime(datetime.datetime.strptime(begin_date,'%Y-%m-%d%H:%M:%S')-datetime.timedelta(hours=8))###减8个小时

dt= collect10.find({'_id':{'$gte':begin_date}}) ###大于等于开始时间的数据筛选条件

df_decision=pd.DataFrame(list(dt))###将数据转化为DataFrame格式

b. 包括/不包括条件

字典嵌套,'$in'的值为列表形式。

dt=collect10.find({'companyId':{'$in':['001','002']

}

}) ###提取companyId为001和002的数据

df_comp=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

不在某些值中,将上面代码中的 $in 换为 $nin 即可。

c. 加入and /or 逻辑条件

并且的逻辑。字典里面的逗号就是表示and的逻辑。

dt=collect10.find({'age':{'$gte':12

,'$lte':18

}

}####年龄大于等于12岁并且小于等于18岁

)

df_decision=pd.DataFrame(list(dt)) ####将这些数据转化为DataFrame格式

或则和的逻辑。or字典,值为列表形式,列表里面以字典键值对形式进行或者条件的设置。

dt= collect10.find({'$or':[{'description':'BB'}

,{'name':'AA'}

]

})### description等于BB 并且 name等于AA的数据

df_3=pd.DataFrame(list(dt))

d. 限制输出条数

使用limit(number),number表示限制的条数。可以先看看数据输出的格式。

dt= collect10.find({'$or':[{'description':'BB'}

,{'name':'AA'}

]

}).limit(10) ### 只输出条数为10条

df_3=pd.DataFrame(list(dt))

e. 选择字段进行输出

可以不输出该数据集合中的所有字段,筛选某些字段输出。

格式为:collect2.find({ 筛选条件},{'字段A':1, '字段B':0,'字段C':1})。

在筛选条件之后,增加字段是否显示的字典键值对,0表示不显示(不输出),1表示显示(输出)。

dt=collect2.find({'$or':[{'description':'BB'}

,{'name':'AA'}

]

}

,{'name':1

,'_id':0

,'status':1

,'requestDuration':1

}

)

###选择description为BB或则name为AA的数据,并且只显示name、description、requestDuration这3个字段。

df_3=pd.DataFrame(list(dt))

f. 进行排序

使用的格式为:

按照某个字段升序排列:

访问的集合命名.find({}).sort('字段名称',pymongo.DESCENDING)

按照某个字段降序排列:

访问的集合命名.find({}).sort('字段名称',pymongo. ASCENDING)

多个字段综合排序:

访问的集合命名.find({}).sort([('字段A',pymongo.DESCENDING)

,('字段B',pymongo.ASCENDING)

,……

]

)

使用sort和limit 结合,可以输出某些排序靠前的数据。经常用来查看最近时间产生的一些数据。

以下代码选取最近10条数据。

#访问data这个数据库

db2=client['data']

###访问这个文档,数据调取记录

collect2=db2.loggerModel

dt= collect2.find({}).sort('_id',pymongo.DESCENDING).limit(10)

#pymongo.DESCENDING 表述倒叙 # pymongo.ASCENDING表示升序

df_3=pd.DataFrame(list(dt))

g. 统计一共多少条数据

代码格式有两种:访问的集合命名.find({ 筛选条件}).count()

访问的集合命名.count_documents({筛选条件})

这两个代码当前都可以不报错,但是第一个会提醒你,这个格式已经被取代了,建议使用第二个格式。大家还是习惯使用第二个吧。

#访问data这个数据库

db2=client['data']

###访问这个文档,数据调取记录

collect2=db2.loggerModel

collect2.count_documents({'$or':[{'description':'BB'}

,{'name':'AA'}

]

})

121963 ###输出结果,一共有121963条

h. 聚合计算,实现与sql代码一样的数据提取逻辑

使用aggregate(),使用格式为:

aggregate([操作标识1: {操作1}

,操作标识2: {操作2}

,操作标识3: {操作3}

,……

])

aggregate是一个管道的概念,操作1的输出结果作为操作2的输入数据,操作2的输出结果作为操作3的输入数据,以此类推。

aggregate 操作标识:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

$limit:用来限制MongoDB聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$group:将集合中的文档分组,可用于统计结果。

$sort:将输入文档排序后输出。

$geoNear:输出接近某一地理位置的有序文档。

在数据提取的时候,常用的操作标识有:$project、$match、$limit、 $group、$sort

$project

常用来筛选字段,以下代码表示只显示name、description、_id三个字段。(_id是默认显示的)

collect2.aggregate([{'$project':{'name':1

, 'description':1}

}

])

$match

数据过滤的操作,类似于sql的where条件,筛选条件的筛选方式如前面a、b、c所述。

collect2.aggregate([{'$match':{筛选条件}}

])

$limit

限制输出的条数

collect2.aggregate([{'$limit':10}

]) ##显示输出10条

$group

实现sql里面group by 的功能。

collect2.aggregate([{'$group': {'_id':"$字段名1" ##字段名称固定为'_id'

,'取个名字2':{'$聚合方式': '$字段名2'}

,'取个名字3':{'$聚合方式': '$字段名3'}

}

}

])

其中,字段名1为聚合的字段,也就是sql里面group by 后面的字段。字段名2是需要进行统计的字段。

示例如下:

dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date}}} ##选择某个时间段之后的

,{'$group':{'_id':"$description"

,'num':{'$sum':1}

}

} ##统计有多少条数据,相当于count(1)

])

df_4=pd.DataFrame(list(dt))

多字段group by 的情况,'_id'的值变为字典键值对,字典里面键值对形式为'取个字段名称': '$字段名'。

示例为:

dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date}}} ##选择某个时间段之后的

,{'$group':{'_id':{'description':"$description"

,'thirdPart':"$thirdPart"}

,'num':{'$sum': '$number'}

,'avgnum':{'$avg':'$number'}

,'minnum':{'$min':'$number'}

}

} ##group by description, thirdPart,对number字段进行求和、平均值、最小值操作

])

df_4=pd.DataFrame(list(dt))

聚合方式:

$max:返回最大值

$min:返回最小值

$avg:返回平均值

$sum:求和的操作

$first:第一个文档数据

$last:最后一个文档数据

$sort

排序,基本格式为:

collect2.aggregate([{'$ sort':{'字段名':1}}

])

按照字段名升序排列 ,1表示升序,-1表示降序

示例如下,按照条件筛选后,统计description分别的个数,再按照个数升序。

Sql代码逻辑:

select description

,count(*) num

from collect2

where _id>= begin_date

and _id<= end_date

and (description='BB' or name in ('AA','CC'))

group by description

order by count(*)

mongo代码实现:

dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date

,'$lte':end_date}

,'$or':[{'description':'BB'}

,{'name':{'$in':['AA','CC']} }

]

}

}####先进行条件筛选

,{'$group':{'_id':"$description",'num':{'$sum':1}}}

,{'$sort':{'num':-1} }

])

df_4=pd.DataFrame(list(dt))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决C语言程序报错:return type defaults to‘int’

下面是通过自定义一个函数printN&#xff0c;之后在main函数中调用printN&#xff0c;使得可以通过输入整数N&#xff0c;将从1到N的全部整数都打印出来的程序。 但是在编译过程中却报错&#xff1a; return type defaults to ‘int’ 产生报错的原因&#xff1a; printN的默认…

cif是目的港交货吗_刚接手出口业务,搞不懂FOB? CIF? 为你科普→

Export专用名词辨析01 名词辨析#FOBFOB(Free On Board)&#xff0c;含义是装运港船上交货&#xff0c;指卖方在合同规定的装运港负责将货物装上买方指定的船上&#xff0c;并负责货物装船之前的一切费用和风险&#xff0c;以及办理出口通关的相关事宜及费用&#xff0c;所以在实…

python字符串的表示形式_python - 如何为类对象创建自定义字符串表示形式?_class_酷徒编程知识库...

当前python 3的更新如下&#xff1a;class MC(type):def __repr__(self):return Wahaha!class C(object, metaclassMC):passprint(C)如果希望跨python 2和python 3运行的代码&#xff0c;则six模块将包含以下内容&#xff1a;from __future__ import print_functionfrom six im…

MyBatis核心接口和类

三大对象&#xff1a; 1、SqlSessionFactoryBuilder&#xff1a;负责构建SqlSessionFactory&#xff0c;并且提供了多个build()方法的重载 2、SqlSessionFactory&#xff1a;创建SqlSession实例的工厂 3、SqlSession&#xff1a;用于执行持久化操作的对象 三大对象获取的步骤&a…

中的数组怎么转成结构体_传说中的“衡水体”应该怎么练?

传说中的“衡水体”应该怎么练&#xff1f;我也不知道&#xff0c;哈哈哈哈哈哈。因为我之前关于衡水体的回答最高赞评论说我这个不是衡水体……随便写的之前的回答所以&#xff0c;这篇文章纯属交流分享&#xff0c;同时枯燥无味&#xff0c;可能适合觉得自己书写不好看的高中…

windows 显示苹果分区_基准测试数据显示苹果M1运行Windows的表现比微软自家硬件好上近一倍...

根据最新的基准测试&#xff0c;苹果M1运行 "Windows 10 on ARM "的速度比微软自家的硬件快了近2倍。更新后的基准数据显示&#xff0c;苹果M1上的Windows 10比Surface Pro X快得多&#xff0c;这还是配备了基于骁龙8cx的处理器的Surface Pro X原生运行该操作系统的环…

centos7默认字体_CentOS7.5字体美化

背景知识有衬线 (Serif) 无衬线 (Sans Serif) 和等宽 (Monospace) 字型1 有衬线 (Serif) 字型是比较正式的字体&#xff0c;比划粗细不一&#xff0c;在笔划的边缘有装饰部分(我的理解是有笔锋)。英文当中比较有名的包括 Times New Roman, Georgia, 而中文当中则是包括大名鼎鼎…

翻译:通向T-SQL的阶梯:超越基础水平3:建立相关子查询

原文链接&#xff1a;http://www.sqlservercentral.com/articles/StairwaySeries/105972/ 原文作者&#xff1a;Gregory Larsen 该系列 本文是楼梯系列的一部分:通向T-SQL的阶梯:超越基础水平 从他的t - sql DML楼梯后,格雷戈里拉森涵盖了更高级的子查询等方面的t - sql语言。…

筛选中很容易粘贴到被隐藏部分_excel复制粘贴:如何将数据粘贴到筛选区域中?...

编按&#xff1a;哈喽&#xff0c;大家好&#xff01;看到标题相信大家都会纳闷吧。复制粘贴不是excel中最简单&#xff0c;最基础的操作吗&#xff1f;怎么可能90%的人都不会呢&#xff1f;今天咱们要说的可不是普通的复制粘贴&#xff0c;而是将数据复制粘贴到筛选后的区域中…

python 发邮件_Python发邮件告别smtplib,迎接zmail

之前介绍过smtplib发邮件代码&#xff0c;直到今天仍有人在这里遇到问题。而且代码复杂&#xff0c;解释起来很麻烦&#xff0c;今天给大家介绍一个新的发邮件方法——zmailzmail的优势自动填充头信息将一个字典映射为email&#xff0c;构造邮件相当于构造字典自动寻找邮件服务…

重复数据_MongoDB 自动过滤重复数据

摘要&#xff1a;使用 update_one() 方法而不是 insert_one() 插入数据。相信你一定有过这样的经历&#xff1a;大晚上好不容易写好一个爬虫&#xff0c;添加了种种可能出现的异常处理&#xff0c;测试了很多遍都没有问题&#xff0c;点击了 RUN 开始正式运行 &#xff0c;然后…

多个canvas画布合并_canvas的基础入门

nvas是定义在浏览器上的画布。它不仅仅是一个标签元素更是一个编程工具是一套编程的接口。利用它可以开发出很多东西&#xff0c;比如动画&#xff0c;游戏&#xff0c;动态的图表等富有变现力和感染力的应用。还可以开发出绚丽的3D动态效果。接下来我们一起学习&#xff01;一…

AngularJS 计时器

<div ng-controller"MyController"><!--显示$scope.clock的now属性--><h1>hello {{clock.now}}</h1><!--显示$scope.clock&#xff0c;里面有一个属性now--><h1>hello {{clock}}</h1> </div><script src"ht…

Rulo扫地机器人app_扫地机器人怎么选?扫地机器人怎么用

扫地机器人又称自动打扫机、智能吸尘、机器人吸尘器等&#xff0c;是智能家用电器的一种&#xff0c;能凭借一定的人工智能&#xff0c;自动在房间内完成地板清理工作。一般采用刷扫和真空方式&#xff0c;将地面杂物先吸纳进入自身的垃圾收纳盒&#xff0c;从而完成地面清理的…

python七巧板三角形_用七巧板拼出14种三角形,这才是图形认知的神器!

原标题&#xff1a;用七巧板拼出14种三角形&#xff0c;这才是图形认知的神器&#xff01;随着幼升小越来越注重孩子的图形认知能力&#xff0c;很多名校幼升小都选择了七巧板作为考验孩子的题目&#xff01;比如北京实验二小09年的幼升小考题中&#xff0c;就有一道“用七巧板…

Docker 容器的常用命令

容器常用的管理命令1. 创建并启动容器 docker rundocker run 创建并启动一个容器&#xff0c;在run后面加上-d参数&#xff0c;则会创建一个守护式容器在后台运行。注&#xff1a; docker run将在下一章节中具体描述2. 查看docker ps -a 查看已经创建的容器3. 停止 docke…

如何在graphpad表示出正负误差_Graphpad Prism:SCI科研论文中误差连线图怎么做

这是一篇高分SCI论文中的图&#xff0c;图中间为均值、均值上下方的浅色为数据误差&#xff0c;即误差连线图。今天跟大家分享如何使用GraphpadPrism作这么好看的图!打开软件&#xff0c;选择XY&#xff0c;按照下图新建折线图&#xff1a;输入数据&#xff1a;得到下图所示折线…

python3123_使用sox和python,基于时间戳列表对音频区域进行静音处理

我有一个音频文件。我有一堆[开始&#xff0c;结束]时间戳段。在我想要实现的目标&#xff1a;假设音频长度为6:00分钟。我有段是&#xff1a;[[0.0,4.0]&#xff0c;[8.0,12.0]&#xff0c;[16.0,20.0]&#xff0c;[24.0,28.0]]在我把这两个传递给soxpython之后&#xff0c;输…

ajax post 传参数加引号和不加引号的区别

1.前言 用ajax技术&#xff0c;type&#xff1a;post&#xff0c;data&#xff1a;参数列表。参数列表就是一个JSON数据&#xff0c;但key可以加引号&#xff0c;也可以不加引号&#xff0c;那总有区别的。 2.区别 var d2 "two"; var d4 "four"; var idAr…

工业机器人专业展板图片_南充职业技术学院工业机器人专业线下课程开展情况...

2020年5月18日&#xff0c;南充职业技术学院线下课程已全面展开&#xff0c;下面是工业机器人技术专业的开课情况。历时4个多月的假期&#xff0c;即将开课。在开课前两天&#xff0c;我司专业教师到学院检查维护机器人设备&#xff0c;以保障学生们能够正常使用工业机器人相关…