一、需求:
之前有次需要临时查找mongo中存储的json串,符合特定条件的记录;
举个例子,mongo中记录如下图:
其中每条存储的数据大概为:
[
{
"createUser": "Zxtech",
"paramName": "OrderNo",
"paramValue": "PSO20231100001",
"type": 1,
"updateUser": "Zxtech"
},
{
"createUser": "Zxtech",
"paramName": "ADRTy",
"paramValue": "NA",
"updateUser": "Zxtech"
},
......
]
比如,我要找出所有 paramName 是 ADRTy , 并且 paramValue 为 NA 的所有记录,
正常找一般怎么做的呢?!挨个把文件下载下来,然后去找符合条件的?或者是java写个接口,调一下?都可以,但是好像都比较麻烦。。。
二、解决:
python连接mongo,然后遍历所有记录,每条记录取出json,然后把json中符合条件的记录,放到一个文件中。
代码:
import pymongo
import gridfs
import json
import os
condition = input("\n>>>请输入条件: \n")
# 解析条件 'paramName': 'ZZ156', 'paramValue': '标准_EX-M01'
# condition = 'V=1.0&&BUFtype=HYD' ZZ156=标准_EX-M01&&Languages=中文
conditions = condition.split('&&')
cond_arr = []
for c in conditions:
cc = c.split('=')
p_name = cc[0]
p_value = cc[1]
t_arr = (p_name, p_value)
cond_arr.append(t_arr)
print(cond_arr)
mongo_ip = input("\n>>>请输入mongo ip: \n")
if mongo_ip is None or mongo_ip == '':
mongo_ip = '192.168.51.19'
print('>>>连接mongo:')
# client = pymongo.MongoClient('192.168.0.222', connect=False)
client = pymongo.MongoClient(mongo_ip, connect=False)
db = client['pso_param']
# 存储到mongodb
# 从mongodb取出文件
fs = gridfs.GridFS(db)
gf = fs.find()
def validate_cond(param_name, param_value):
# cond_arr = [(V, 1.0), ('BUFtype', HYD)]
for cond in cond_arr:
# (V, 1.0)
if param_name == cond[0] and param_value == cond[1]:
return True
return False
pass
for a in gf:
bs = a.read()
string = str(bs, 'utf-8')
print('>>>文件名:', a.filename)
try:
param_json = json.loads(string)
except:
print('json转换报错了')
continue
if param_json is None:
print('continue')
continue
# print(param_json)
# 查V=1.0 且 BUFtype=HYD的所有任务;
valid_res = []
# [{'paramName': 'Languages', 'paramValue': '中文', ...}, {...}, ...]
for j in param_json:
if j is not None and 'paramValue' in j:
val_res = validate_cond(j['paramName'], j['paramValue'])
if val_res:
valid_res.append(val_res)
if len(valid_res) == len(cond_arr):
print(a.filename + "\n")
io = open("d:/ccc.txt", 'a', )
# 不存在文件,写入文件内容
io.write(a.filename + "\n")
io.close()
print('执行结束')
三、打包
生成可执行的exe文件(参数-F 就是为了生成exe的)
pyinstaller -F mongo.py
四、效果
先在新建个txt文件,路径为:d:/ccc.txt
首先是提示输入查询条件,例:V=1.0&&BUFtype=HYD
然后是提示输入mongo的ip,例:192.168.0.222
…
运行完,查看d盘下的ccc.txt文件就可以了。
(注:open(“d:/ccc.txt”, ‘a’, ) 其中的‘a’第二次运行时是不会删除原内容的)
五、扩展
这个可以写的更好,更完善,本人这个只是用一次就扔了,基本不会再用,所以写的比较随意。
可以增加ui,查询框,查询结果…
还有关于open的参数,可以按照下面的调整