话在前:不足之前,请多多指教
一、多层字典解析问题
原题目
代码语言:javascript复制{
"Count":5,
"Items":
[
{
"name":{"string":"a"},
"email":{"string":"abc@163.com"},
"friends":
[
{
"friend1": {
"name": {
"string": "name1"
},
"sex": {
"int": 1
},
"addr": {
"string": "addr1"
}
}
}
],
"moreinfo":{
"Desc1":{"string":"aaaa"},
"Desc2":{"int":22},
"Desc3":{"list":["ddddd","11111"]}
}
}
]
}
将上面的json文件,转化为python内容,并且去掉不需要的数据例如(包含对应的数据类型如:string,int,list)之后变为
代码语言:javascript复制{
"Count":5,
"Items":
[
{
"name":"a",
"email":"abc@163.com",
"friends":
[
{
"friend1": {
"name": "name1"
"sex": 1
"addr": "addr1"
}
}
],
"moreinfo":{
"Desc1":"aaaa",
"Desc2":22,
"Desc3":"ddddd","11111"}
}
}
]
}
解题思路:使用递归解决多层字典的节点问题,子节点有列表和字典两种表现形式,所以这两种形式都是递归,
解题代码
代码语言:javascript复制import json
# 修改的函数
def modify(dic):
# 确保传进来的是一个字典,这里我并没有使用try-except做容错,只是简单的为了需求的实现
if isinstance(dic,dict):
# 变量字典的key和value
for key,val in dic.items():
# 这里多层字典嵌套的话,子层主要是字典或者列表的方式,方式这里主要针对子层是字典和列表两种方式处理
if isinstance(val,dict):
# 如果val是一个字典,并且长度为1,说明是最内层的字典了,是需要做处理的地方了
if len(val) == 1:
# 将内层字典的val赋值给上一层的key,即项目的需求
dic[key]=list(val.values())[0]
# 如果不是最内层,继续递归
modify(val)
# 内层数据是列表的情况
elif isinstance(val,list):
if len(val)>0:
for _dic in val:
# 列表里面是字典继续递归
modify(_dic)
if __name__ == '__main__':
with open('./test_json.json', 'r') as fp:
json_str = fp.read()
json_dic = json.loads(json_str)
print('修改前打印*********************')
print(json_dic)
modify(json_dic)
print('修改后打印*********************')
print(json_dic)
打印结果
代码语言:javascript复制修改前打印*********************
{'Count': 5, 'Items': [{'name': {'string': 'a'}, 'email': {'string': 'abc@163.com'}, 'friends': [{'friend1': {'name': {'string': 'name1'}, 'sex': {'int': 1}, 'addr': {'string': 'addr1'}}}], 'moreinfo': {'Desc1': {'string': 'aaaa'}, 'Desc2': {'int': 22}, 'Desc3': {'list': ['ddddd', '11111']}}}]}
修改后打印*********************
{'Count': 5, 'Items': [{'name': 'a', 'email': 'abc@163.com', 'friends': [{'friend1': {'name': 'name1', 'sex': 1, 'addr': 'addr1'}}], 'moreinfo': {'Desc1': 'aaaa', 'Desc2': 22, 'Desc3': ['ddddd', '11111']}}]}
二、mongodb的基本使用
原题目:
代码语言:javascript复制Mongodb 查询:
Db.msg.find()
{ "_id" : ObjectId("5f96ef6c1fb5b9e52cd23179"), "msgId" : 1696261644, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "ufne", "newMsgId" : NumberLong("4690548300089373689"), "createTime" : 1603727095 }
{ "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317a"), "msgId" : 1696261645, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 10002, "content" : "<sysmsg type="ClientCheckConsistency"</ClientCheckConsistency></sysmsg>", "newMsgId" : NumberLong("4429536039473582128"), "createTime" : 1603727095 }
{ "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317b"), "msgId" : 1696261647, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "Hello", "newMsgId" : NumberLong("1453640785042681328"), "createTime" : 1603727109 }
{ "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317c"), "msgId" : 1696261648, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 1, "content" : "gggg", "newMsgId" : NumberLong("4776642146216801785"), "createTime" : 1603727130 }
….
以user1,user2为例,需要获取 user1, user2 相互聊天信息中最后一条聊天的信息。
构造一个方法,获取查询记录中,指定用户的最后一条聊天记录。
Def get_last_msg(user:str) -> msg_dict:dict:
另外针对获取最后一条信息的场景,提出解决方案。
数据在mongodb中显示为
代码为
代码语言:javascript复制import pymongo
# 链接mongodb
pymongo_client = pymongo.MongoClient('mongodb://root:123456@127.0.0.1:27017')
# 链接数据库
pymongo_db = pymongo_client['test_db']
# 链接表
pymongo_table = pymongo_db.test_table
def get_last_msg(user):
# 管道条件
pipeline = [
# 根据传递过来的用户进行搜索
{'$match':{'fromUserName':user}},
# 因为要最后一条,所以倒叙更方便
{'$sort': {'createTime': -1,}},
# 倒叙后取出第一条
{'$limit':1}
]
# 插叙
ret = pymongo_table.aggregate(pipeline)
ret1 = [u for u in ret]
# 返回结果
return ret1[0]
msg = get_last_msg('user2')
# 打印验证
print(msg)
打印结果
代码语言:javascript复制{'_id': ObjectId('5fce176c3dcc6560be446156'), 'msgId': 1696261648.0, 'fromUserName': 'user2', 'toUserName': 'user1', 'msgType': 1.0, 'content': 'gggg', 'newMsgId': '"4776642146216801785"', 'createTime': 1603727130}
补充:另外针对获取最后一条信息的场景,提出解决方案,不是很理解,往有知道的朋友可以指点一二,感谢!