python查找mongo中符合条件的json记录

发布时间:2023年12月29日

一、需求:

之前有次需要临时查找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的参数,可以按照下面的调整
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_20741133/article/details/135287302
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。