import pymongo as pyg
import datetime
import into_mysql #导入MySQL类(将解析后的MongoDB数据插入到MySQL中)
# 填入自己的MongoDB的IP、帐号、密码
conn = pyg.MongoClient('172.00.00.000',27001, username='******', password='************')
mydb = conn["*****l"] #自己的库名
mycol = mydb["*******"] #自己的表名
#自定义解析时间,如果MongoDB中有对应时间字段,可以设置从哪里开始解析
#start = datetime.datetime(2019, 6, 1,00,00,00)
#设置解析到哪里结束
#end = datetime.datetime(2019, 8, 20,00,00,00)
#查询主体 myqurey 如果自定义时间段,则使用这个 myqurey
#myqurey = {"createTime":{"$gt":start,"$lte":end}}
#全量解析数据的 myqurey ,使用这个myqurey ,则默认全量解析数据
myqurey = {}
result=mycol.find(myqurey)
json_value = result
count = -1
#将解析后的多个字段,暂存到集合中
new_list=[]
# 无限循环解析数据,这里也可以用for循环,但是for循环可能会遇到解析一点数据就报错,下面放for循环不报错解析
while True:
count = count+1
print(count)
# 1 解析第一个字段
try:
#增加字段容错,如果取数报错,可以设置一个错误值,或者置null
idCode = json_value[count]["idCode"]
if idCode is None or idCode == "":
idCode = '-999'
except:
idCode = '-999'
# 将解析后的字段放入集合中
new_list.append(idCode)
# 2 解析第二个字段,如果需要增加字段,自己增加即可
try:
phone = json_value[count]["phone"]
if phone is None or phone == "":
phone = '-999'
except:
phone = '-999'
new_list.append(phone)
# 取出MongoDB入数据库的时间(如果有时间字段,可以解析时间)
createTime = str(json_value[count]["createTime"])[:19]
createTime = datetime.datetime.strptime(createTime, "%Y-%m-%d %H:%M:%S")
# 当前时间
insertTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
new_list.append(createTime)
new_list.append(insertTime)
print(jxlCarrierTaskCreateCallBackBean)
# 把解析后的数据插入到mysql数据库
into_mysql.insert_mysql(new_list)
#将集合置空
new_list[:] = []
into_mysql类
# 导入包
import pymysql
#插入MySQL数据的方法,将集合中的内容插入到MySQL表中
def insert_mysql(s=[]):
#你的MySQL地址,帐号,密码,端口号,库名,字符集
conn = pymysql.connect(host='********', user='root', passwd='*******', port=3306, db='test', charset='utf8')
cur = conn.cursor()
#插入语句,对应集合中的字段
sql = "insert into test01( id,name,insertTime,updt) values (\"%s\",\"%s\",\"%s\",\"%s\")" % (s[0], s[1], s[2], s[3])
print(sql)
cur.execute(sql)
conn.commit()
for循环解析
总体上是没什么区别的,只是for循环需要对时间进行切片,最好是每小时一个切片,这样可以保证不会出现报错
import pymongo as pyg
import datetime
import into_mysql_json_03
import time
import pandas as pd
from sqlalchemy import create_engine
conn = pyg.MongoClient('***********',27001, username='**********', password='*********')
mydb = conn["******"]
mycol = mydb["*******"]
count = 0
#定义时间切片次数,这个随意定义一个,可以是MongoDB中数据的总量
list = range(0,100000)
#切片开始时间 2018-11-19 07:21:11.825Z
start = datetime.datetime(2019, 8, 13, 15, 00, 00)
#切片结束时间
end = datetime.datetime(2019, 8, 13, 16, 00, 00)
#时间循环
for i in list:
#时间切片的频次
start = start + datetime.timedelta(hours=1)
end = end + datetime.timedelta(hours=1)
print(start)
print(end)
myqurey = {"createTime":{"$gt":start,"$lte":end}}
#运行sql
#myqurey = {}
demos = mycol.find(myqurey,no_cursor_timeout = True)#,no_cursor_timeout = True
#解析详细内容
for json_value in demos:
#存放时间的list
time_list = []
#主键
Code= json_value['Code']
print(Code)
#MongoDB的数据创建时间
createTime = str(json_value["createTime"])[:19]
createTime = datetime.datetime.strptime(createTime, "%Y-%m-%d %H:%M:%S")
time_list.append(createTime)
# MongoDB解析数据插入mysql数据的时间
insertTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#插入到之前定义的time_list中
time_list.append(insertTime)
#解析详细数据
try:
#存放解析出来的list
new_list= []
#存放主键
new_list.append(Code)
#1
try:
new_list.append(json_value['解析的字名'])
except:
new_list.append('null')
#2
try:
new_list.append(json_value['result_verify']['tl_cell_lasttime'])
except:
new_list.append('null')
#添加之前的时间list
new_list.extend(time_list)
print(new_list)
#into_mysql.insert_mysql(new_list)
print('入库成功')
except:
print('错误')
demos.close()
解析MongoDB还会遇到例如多层级数据解析的问题, 我的解决方法是循环套循环,而且比较麻烦,容易出错,这里就不放上来了,如果有大神有更好的解析方案,希望能共享出来学习一下。
我这个写的比较简陋,但是介于现在很多解析方法都使用都有问题,不能很好的处理解析需求,如果有更好更快的方法可以共享出来