利用Python读取MongoDB的数据

2023-11-20

近日在处理数据的时候遇到一个问题,数据存储在MongoDB数据库(如图1),而MongoDB模式自由、具有很大的灵活性,可以把不同结构的文档存储在同一个数据库里,即表的字段不是完全固定的,当某个字段有值时就会显示该字段,而当该字段没有值时就不显示该字段。因此,同一个数据库表根据不同的条件查询得到的字段数可能会不一样,如图2可以看到按不同的SourceCode查询时,字段个数不同。现在想得到每个SourceCode下的数据包含哪些字段,而SourceCode取值有70多个,如果手动统计有点耗时,于是想到利用Python读取MongoDB数据来解决这一问题。
在这里插入图片描述
在这里插入图片描述

Step1:安装pymongo

pymongo是Python中用来操作MongoDB的一个库。

pip install pymongo

Step2:连接MongoDB

连接MongoDB时,需要使用PyMongo库里面的MongoClient,可以直接传入MongoDB的连接字符串“mongodb://用户名:密码@IP:端口号/”,即以mongodb开头,依次传入用户名、密码、IP和端口号。如果端口号不给传递参数,默认为27017。

from pymongo import MongoClient
import pandas as pd
#方式一
client = MongoClient('mongodb://username:password@192.168.146.192:27017/')

Step3:指定数据库

MongoDB中可以建立多个数据库,因此需要指定要操作哪个数据库。

##指定要操作的数据库,test
db = client.test  

Step4:指定数据库表

每个数据库中有多个表,因此需要指定要操作哪个表。

##限定数据库表,InternationalData.ILO_Value_20201207
mycol = db["InternationalData.ILO_Value_20201207"]

Step5:获取SourceCode的取值

前面提到,想查看每个SourceCode下的字段,因此需要先获取SourceCode的取值,直接运用distinct实现SourceCode的去重查询。

#获取SourceCode,直接从MongoDB查询获得
Scode = mycol.distinct( "SourceCode")
#print (Scode)

Step6:遍历SourceCode,依次获取各字段

遍历SourceCode,利用find()实现按SourceCode查询。find()返回的是Cursor类型,它相当于一个生成器,需要遍历取到所有的结果,其中每个结果都是字典类型。

totalkey=[]  #totalkey记录所有SourceCode的涉及到的字段列表
key=[]
record=[]  
t=1  ## 记录第几个SourceCode
##遍历SourceCode
for code in Scode:
    #code=code
    print (t,code)
    t+=1  
    ##设置查询的条件
    myquery={ "SourceCode" : code }
    mydoc=mycol.find(myquery)
    
    i=0  ## i记录每个SourceCode对应的记录数
    keyvalue=[]  #keyvalue记录每个SourceCode的字段列表
    ##遍历每个SourceCode下的记录
    for x in mydoc:
        #print (x)
        i+=1
        for j in x.keys():  ##遍历每条记录的字段
            if j not in keyvalue:
                keyvalue.append(j)
            if j not in totalkey:
                totalkey.append(j)
    #print (keyvalue)
    #print (i)
    #data["SourceCode"].append(code)
    key.append(keyvalue)
    record.append(i)

Step7:保存结果

data=pd.DataFrame()
print (data)

data["SourceCode"]=Scode
data["Keyvalue"]=key
data['record']=record
print(totalkey)
#print(data.head())

data.to_csv('data/result.csv',encoding='gb18030',index=1)

在这里插入图片描述
最后附上完整代码。

###获取分别按SourceCode查询后的字段集合

from pymongo import MongoClient
import pandas as pd
##连接MongoDB
client = MongoClient('mongodb://username:password@192.168.146.192:27017/')
##指定要操作的数据库,test
db = client.test  
##获取数据库中的所有表
collection_list = db.list_collection_names()
print(collection_list)

##限定数据库表,InternationalData.ILO_Value_20201207
mycol = db["InternationalData.ILO_Value_20201207"]

#获取SourceCode
##方式一:SourceCode从excel中读取
'''
scode_data=pd.read_csv('data/SourceCode.csv',encoding='gb18030')
print(scode_data.head())
Scode=scode_data['SourceCode'].values
'''

##方式二:SourceCode直接从MongoDB查询获得
Scode = mycol.distinct( "SourceCode")
#print (Scode)

#方式三:直接写列表
#Scode=["ABW_A"]

totalkey=[]  ##totalkey记录所有SourceCode的涉及到的字段列表
key=[]
record=[]
t=1  ## 记录第几个SourceCode
##遍历SourceCode
for code in Scode:
    #code=code
    print (t,code)
    t+=1  
    ##设置查询的条件
    myquery={ "SourceCode" : code }
    mydoc=mycol.find(myquery)
    
    i=0  ## i记录每个SourceCode对应的记录数
    keyvalue=[]  #keyvalue记每个SourceCode的字段列表
    ##遍历每个SourceCode下的记录
    for x in mydoc:
        #print (x)
        i+=1
        for j in x.keys():  ##遍历每条记录的字段
            if j not in keyvalue:
                keyvalue.append(j)
            if j not in totalkey:
                totalkey.append(j)
    #print (keyvalue)
    #print (i)
    #data["SourceCode"].append(code)
    key.append(keyvalue)
    record.append(i)

data=pd.DataFrame()
print (data)

data["SourceCode"]=Scode
data["Keyvalue"]=key
data['record']=record
print(totalkey)
#print(data.head())

data.to_csv('data/result.csv',encoding='gb18030',index=1)

ps:初衷是通过撰写博文记录自己所学所用,实现知识的梳理与积累;将其分享,希望能够帮到面临同样困惑的小伙伴儿。如发现博文中存在问题,欢迎随时交流~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用Python读取MongoDB的数据 的相关文章

随机推荐

  • 一个boot.oat crash问题的分析

    最近遇到一个手机重启的问题 日志如下 05 18 13 42 55 553 I AEE AED 10514 pid 1734 tid 1788 name android ui gt gt gt system server lt lt lt
  • 了解数据的发展历程--大数据简史

    数据技术的发展历史就是人类追求美好生活过程最真实的写照 大数据分析的历史与未来展望 最早的数字不是阿拉伯人发明的 数字的起源如同文字起源一样古老 结绳记事 易九家言 中记载 事大 大结其绳 事小 小结其绳 之多少 随物众寡 即根据事件的性质
  • 2048游戏矩阵操作算法

    题目 1 手指向一个方向滑动 所有格子会向那个方向运动 2 相同数字的两个格子 相撞时数字会相加 输入描述 1 输入为一个3 3的矩阵 2 接下来输入一个1 4的数字 1表示向上滑动 2表示向下划动 3表示向左滑动 4表示向右滑动 输出描述
  • Ireport 报表设计部分填坑记录 基于Ireport 4.5.1

    Ireport 报表设计 基于Ireport 4 5 1 Ireport 换行遇到分页时 一行会被拆分为两行 断行 方式一 面板直接修改 点击detail栏的空白处 修改其 Split Type属性值为 Prevent 如果方式一 无法修改
  • 内存取证CTF-Memlabs靶场6

    1 挑战说明 我们从情报局收到了这个内存转储 他们说这个证据可能包含黑帮大卫本杰明的一些秘密 这个内存转储是从本周早些时候被 FBI 逮捕的他的一名员工那里获取的 你的工作是通过内存转储 看看你是否能找出一些东西 FBI还表示 大卫通过互联
  • 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)

    普通按钮 普通按钮xml设置
  • [NCTF2019]Fake XML cookbook

    NCTF2019 Fake XML cookbook 日常刷题 打开题目嗯 一开始我的脑子里想到的是禁止自娱自乐 狗头 哈哈 第一想法就是试一下admin 别问为什么 web狗的自觉 果然没这么容易 抓包 将提交的数据放到了doLogin
  • vue router在同界面使用 this.$router跳转路由,mounted不再调用

    1 在vue中 刷新数据常用的办法是 this r o u t e r g o 0 或 者 t h i s router go 0 或者this router go 0 或者this router push path 在最近一次的使用时 发
  • 第三章 总线

    一 系统总线概念 系统总线是计算机内部各个组件之间传输数据和控制信息的通信线路 连接中央处理器 内存 输入输出设备 扩展插槽等各个组件 是计算机系统中最重要的硬件组成部分之一 具有数据传输 控制信号传输和总线协议等功能 系统总线的性能对计算
  • 登录即代表您同意 用户服务协议

    UILabel remindLabel if remindLabel remindLabel UILabel alloc init NSDictionary attributes NSFontAttributeName UIFont sys
  • 一文搞懂Mybatis原理

    文章目录 一 快速入门 二 查询流程分析 2 1首先通过ClassLoader读取配置文件生成输入流 2 2建造者模式加载配置创建SQLSessionFactory 2 2 1SQLSessionFactoryBuilder builder
  • 排序算法(2) 快速排序——快排原理以及快排函数qsort

    上次我们分享了一个基本排序方法 冒泡排序的使用 今天我们来分享第二种排序方法 快速排序 快速排序 我们简称快排 我们先来回顾一下上次的冒泡排序 冒泡排序就是在一个序列里 两两比较并根据大小关系进行换位处理 经过多次从头到尾的比较 从而实现整
  • 百面A/B测试

    1 在对模型进行过充分的离线评估之后 为什么还要进行在线A B测试 1 离线评估无法完全消除模型过拟合的影响 因此 得出的离线评估结果无法完全替代线上评估结果 2 离线评估无法完全还原线上的工程环境 一般来讲 离线评估往往不考虑线上环境的延
  • 华为OD机试真题- 日志首次上报最多积分【2023Q1】

    题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁 会对服务端造成压力 如果上报太晚 会降低用户的体验 如果一次上报的条数太多 会导致超时失败 为此 项目组设计了如下的上报策略 1 每
  • 三种出包命令npm, yarn, webpack的对比

    在出包的时候 总是会在不同项目里看到不同的出包命令 但留心观察了一下 最常被使用的就是下面这三个 npm run XXX yarn run XXX webpack entry file destination for bundled fil
  • C++---之waitKey()函数

    waitKey 函数详解 1 waitKey 这个函数是在一个给定的时间内 单位ms 等待用户按键触发 如果用户没有按下 键 则接续等待 循环 2 如下所示 while 1 if waitKey 100 27 break 在这个程序中 我们
  • eclipse maven 导出项目依赖的jar包

    本文转自至 http blog csdn net andyliulin article details 46544555 一 导出到默认目录 targed dependency 从Maven项目中导出项目依赖的jar包 进入工程pom xm
  • Qt在windows和linux下使用默认浏览器打开设置的链接

    QString webstr http www baidu com 设置要打开的网页 bool openService QDesktopServices openUrl QUrl webstr 使用默认浏览器打开 if openServic
  • Testflight 添加外部测试人员

    内部测试人员 不需要提供所有的metadata 外部测试人员 为了使得外部人员可以测试app的预发布build 必须提供如下的metadata What to test App description Feedback email Mark
  • 利用Python读取MongoDB的数据

    近日在处理数据的时候遇到一个问题 数据存储在MongoDB数据库 如图1 而MongoDB模式自由 具有很大的灵活性 可以把不同结构的文档存储在同一个数据库里 即表的字段不是完全固定的 当某个字段有值时就会显示该字段 而当该字段没有值时就不