概述:

对应SQL型数据库,对于存放的数据,我们必须设置相应的键,并且按照键来填写每一行的数据信息。在面对一些格式不确定的信息时,使用SQL型数据库就较为困难。

MongoDB 是一个基于分布式文件存储的数据库。它将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

例如,当我们存储不同网络设备重要信息时,可以按照如下组织的结构进行存储,并且每一个设备的格式可以不同:

如果后续有其他信息,也方便添加和修改。

MongoDB的优势:

  1. 可以创建文档,而不必首先定义它们的结构;
  2. 每个文档可以有它自己独特的结构;
  3. 语法可以随着数据库的不同而不同;
  4. 可以添加字段;
  5. 在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能可以,同时它的写入性能也很厉害,可以写入百万级别的数据。

MongoDB安装:

使用Docker安装:https://hub.docker.com/_/mongo

  1. 从docker拉取镜像:

    docker pull mango
    
  2. 创建容器:

    docker run --name some-mongo(容器名称) -d(后台运行) mongo:tag(mongoDB版本,没有tag表示latest)
    
  3. 进入容器数据库:

    docker exec -it some-mongo  mongo
    

MongoDB基础操作:

  1. 创建数据库:

    use admin(默认管理员数据库)
    
  2. 创建属于自己的系统管理员:

    db.createUser({user:"admin",pwd:"Cisc0123",roles:["root"]})
    
  3. 使用管理员对admin数据库进行认证:

    db.auth('admin','Cisc0123')
    
  4. 查看数据库:

    show dbs
    

  5. 创建自定义数据库,和管理员:

    use dev_info
    db.createUser({user:'dev_admin',pwd:"Cisc0123",roles:[{role:"dbOwner",db:"dev_info"}]})
    db.auth('dev_admin','Cisc0123')
    
  6. 创建集合并插入文档数据:

    db.device.insert({dev_vendor:'Cisco'})
    

    创建了一个device的集合,并插入的文档数据。

  7. 查看数据库中集合和集合中文档信息:

    show tables
    db.device.find()
    


    在文档内容较多的时候,如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

    db.device.find().pretty()
    

    如果文档中含有数字信息,可以使用条件操作符对其进行过滤查看。MongoDB中条件操作符有:

     (>) 大于 - $gt(<) 小于 - $lt(>=) 大于等于 - $gte(<= ) 小于等于 - $lte
    

    查找device集合中,设备数量大于10的文档:

    db.device.insert({dev_vendor:'Cisco',number:20})
    db.device.insert({dev_vendor:'Huawei',number:5})
    db.device.find({number : {$gt : 10}})
    

    类似于SQL语句:

    Select * from device where number > 10;
    

    结果为:

  8. 更新数据:

    db.device.update({dev_vendor : "Cisco" },{$set:{dev_vendor : "Huawei" }},{multi:true})
    

    以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

  9. 删除文档:

    db.device.remove({dev_vendor : "Huawei" })
    

    默认会匹配多条记录信息,如果想输出第一条找到的记录:

    db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
    

    删除集合device中的所有文档信息:

    db.device.remove({})
    
  10. 删除集合:

    db.device.drop()
    
  11. 删除数据库:

    db.dropDatabase()
    

    进入数据库后使用如上命令删除数据库。

MangoDB Python实战:

实验目的:
将获取的SNMP信息根据自己组织的数据格式写入MongoDB中:

实验环境:
CSR1000v,IP地址为192.168.0.166。

实验步骤:
1.获取SNMP返回信息并处理:
snmpv2_get.py代码:

from pysnmp.hlapi import *
from pysnmp.entity.rfc3413.oneliner import cmdgen# SNMP GET方法代码:
def snmpv2_get(ip, community, oid, port=161):# varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIB variable)error_indication, error_status, error_index, var_binds = next(getCmd(SnmpEngine(),CommunityData(community),UdpTransportTarget((ip, port)),ContextData(),ObjectType(ObjectIdentity(oid))))# 错误处理if error_indication:print(error_indication)elif error_index:print('%s at %s' % (error_status,error_index and var_binds[int(error_index) - 1][0] or '?'))# 如果返回结果又多行,需要拼接后返回result = ""for varBind in var_binds:# 返回结果result = result + varBind.prettyPrint()# 返回的为一个元组,OID与字符串结果# print(result)return result.split("=")[0].strip(), result.split("=")[1].strip()# 当多个叶节点的时候(例如接口信息),使用GETNEXT,返回多个信息
def snmpv2_getnext(ip, community, oid, port=161):cmd_gen = cmdgen.CommandGenerator()error_indication, error_status, error_index, var_bind_table = cmd_gen.nextCmd(cmdgen.CommunityData(community),  # 设置communitycmdgen.UdpTransportTarget((ip, port)),  # 设置IP地址和端口号oid,  # 设置OID)# 错误处理if error_indication:print(error_indication)elif error_status:print(error_status)result = []# varBindTable是个list,元素的个数可能有好多个。它的元素也是list,这个list里的元素是ObjectType,个数只有1个。for var_bind_table_row in var_bind_table:for item in var_bind_table_row:result.append((item.prettyPrint().split("=")[0].strip(), item.prettyPrint().split("=")[1].strip()))return result

2.调用获取SNMP信息函数,将返回的SNMP信息按照自己组织的格式写入mongoDB中:
write_dev_info_to_db.py

from snmpv2_func import snmpv2_get, snmpv2_getnext
from pymongo import *
from pprint import pprint
import datetime
import time# 将信息写入mongoDB的函数
def write_info_to_db(dict_info):# 设置Mongodb的参数,dev_admin处为管理员账号,Cisc0123为密码,192.168.0.166位存放数据库的位置,27017为默认port,device_info为数据库名字client = MongoClient('mongodb://dev_admin:Cisc0123@192.168.0.166:27017/device_info')db = client['device_info']# 插入文档信息db.dev_info.insert_one(dict_info)print('*'*50+'写入信息:'+'*'*50)for obj in db.dev_info.find():pprint(obj, indent=4)if __name__ == '__main__':print("收集路由器数据中,按ctrl+c退出")try:while True:# 获取接口名称信息if_name_raw = snmpv2_getnext("192.168.0.66", "tcpipro", "1.3.6.1.2.1.2.2.1.2", port=161)if_name_list = [i[1] for i in if_name_raw]# 获取接口速率信息if_speed_raw = snmpv2_getnext("192.168.0.66", "tcpipro", "1.3.6.1.2.1.2.2.1.5", port=161)if_speed_list = [i[1] for i in if_speed_raw]# 获取接口入字节数if_in_raw = snmpv2_getnext("192.168.0.66", "tcpipro", "1.3.6.1.2.1.2.2.1.10", port=161)if_in_list = [i[1] for i in if_in_raw]# 获取接口出字节数if_out_raw = snmpv2_getnext("192.168.0.66", "tcpipro", "1.3.6.1.2.1.2.2.1.16", port=161)if_out_list = [i[1] for i in if_out_raw]# 5秒内CPU利用率cpu_usage = snmpv2_get("192.168.0.66", "tcpipro", "1.3.6.1.4.1.9.9.109.1.1.1.1.3.7", port=161)# 内存使用mem_usage = snmpv2_get("192.168.0.66", "tcpipro", "1.3.6.1.4.1.9.9.109.1.1.1.1.12.7", port=161)# 内存空闲mem_free = snmpv2_get("192.168.0.66", "tcpipro", "1.3.6.1.4.1.9.9.109.1.1.1.1.13.7", port=161)# 记录时间record_time = datetime.datetime.now()# 将其他参数写入一个字典other_info_dict = {'cpu_usage:': cpu_usage[1], 'mem_usage': mem_usage[1], 'mem_free': mem_free[1],'record_time': record_time, 'ip': '192.168.0.66'}# 组织写入的文档数据格式final_list = []for name, speed, in_bytes, out_bytes in zip(if_name_list, if_speed_list, if_in_list, if_out_list):final_list.append({'name': name, 'speed': speed, 'in_bytes': in_bytes, 'out_bytes': out_bytes})# pprint(final_list, indent=4)final_dict = {"int_info": final_list, 'other_info': other_info_dict}write_info_to_db(final_dict)time.sleep(10)except KeyboardInterrupt:  # 捕获Ctrl+C,打印信息并退出print("Crtl+C Pressed. Shutting down.")

3.测试结果:

写入的信息如下:

参考资料:
https://www.runoob.com/mongodb/mongodb-tutorial.html
https://www.bilibili.com/video/BV1Kt411c7tH?p=2

NetDevOps常用数据库python实战-MongoDB相关推荐

  1. 后端常用数据库的使用MongoDB, Redis, Mysql

    后端常用数据库的使用 数据库安装 (ubuntu操作系统) mysql安装 redis安装 mongodb安装 mysql 使用 (增删改查) mysql 数据库前置知识: mysql 是一个软件, ...

  2. 〖Python 数据库开发实战 - MongoDB篇⑥〗- MongoDB的用户管理

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  3. 〖Python 数据库开发实战 - MongoDB篇④〗- Linux环境下的MongoDB数据库安装

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  4. 〖Python 数据库开发实战 - MongoDB篇⑧〗- MongoDB的数据结构

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  5. 〖Python 数据库开发实战 - MongoDB篇③〗- Windows环境下的MongoDB数据库安装

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  6. 〖Python 数据库开发实战 - MongoDB篇②〗- Mac环境下的MongoDB数据库安装

    ✌ 大家好,我是 哈士奇 ,一位工作了十年的"技术圈混子", 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区. ✌

  7. 〖Python 数据库开发实战 - MongoDB篇⑤〗- 安装和使用MongoDB客户端软件

    ✌ 大家好,我是 哈士奇 ,一位工作了十年的"技术圈混子", 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区. ✌

  8. 〖Python 数据库开发实战 - MongoDB篇①〗- MongoDB数据库简介

    ✌ 大家好,我是 哈士奇 ,一位工作了十年的"技术圈混子", 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区. ✌

  9. Python使用MongoDB简记

    <MongoDB使用简记>   常用的数据库就是关系型数据库MySQL.Oracle以及非关系型数据库Redis.HBase等,数据库和基础数据结构一样,无非就是增.删.改.查,根据不同的 ...

  10. MongoDB的安装到使用 + Python操作MongoDB + 有关系和无关系数据库比较

    day1 - day7 mongoDB学习第一天 数据库 MongoDB (芒果数据库) 数据存储阶段 文件管理阶段 (.txt .doc .xls) 优点 : 数据可以长期保存 可以存储大量的数据 ...

最新文章

  1. TypeScript超越C++成第四大语言,GitHub这份年度报告有太多“意想不到”
  2. Java五道输出易错题解析(进来挑战下)
  3. 服务端高并发分布式架构演进之路(转载,图画的好)
  4. 如何成为一个优秀的高级C++程序员
  5. Flutter Duration详细概述
  6. malloc 和free设计
  7. python 模块zlib 压缩与解压
  8. 基于C/C++的PCM编码与解码简单实现
  9. 数论_埃氏筛法(求区间内多少素数)
  10. SpringBoot+zxing批量生成二维码_南国
  11. 苹果App Store 应用商店页面的优化技巧
  12. 看完《指环王》说几句
  13. 马云唱京剧《空城计》,柳传志说相声:“商界春晚”大佬们真会玩(附视频)...
  14. java 代码圣诞的祝福_圣诞祝福短信全集
  15. 高低温湿热试验箱的简介
  16. mysql多表查询视图_mysql多表查询并创建视图
  17. 邯郸计算机学校排名2015,邯郸初中排名2021最新排名,邯郸初中排名前十的学校有哪些...
  18. 基于Unity3D的自动寻路车辆模拟
  19. linux嵌入式开发所用工具
  20. 埋骨何须桑梓地,人生无处不青山!

热门文章

  1. 摘要抽取算法——最大边界相关算法MMR(Maximal Marginal Relevance)
  2. Mobile Widget——让开发移动应用就像做网页
  3. 85相似标准形06——初等因子、初等因子与不变因子的求法
  4. 树莓派桌面没有时间_树莓派3B/3B+开启手机远程桌面和终端,没有屏幕和电脑的伙伴们有福啦!...
  5. python基础知识点汇总_Python基础知识梳理
  6. 现控笔记(五)稳定性与Lyapunov方法
  7. react中dispatch_reactjs – TypeError:dispatch不是函数.在React无状态组件中
  8. vue element ui 样式修改无效
  9. Java 的运行机制
  10. Android SQLite封装sql语句、查看数据库