说明
算网计算了一些结果存在本地的mongo数据库中,现在希望通过公网访问的形式提供给其他人看。
- m1: 算网保存计算结果的机器,mongo
- c1: 公网云主机,提供内网穿透的机器 frps
- c2: 公网云主机,提供公网访问的机器 flask
1 内容
1.1 m1:frpc透传暴露数据库连接端口
- 1 在~/config/frp 下配置数据库的透传端口
# 映射mongo
[ssh001003]
type = tcp
local_ip = 127.0.0.1
local_port = 27017
remote_port = 11111
然后将此文件拷贝到frpc目录下
# 将配置文件替换下载文件夹里的文件
cp ~/config/frp/frpc.ini /opt/frp/frp_0.34.0_linux_amd64/frpc.ini
再重新启动frpc服务
systemctl restart frpc
使用navicat配置后可以正常访问m1数据库了
1.2 c2:访问数据视图函数
这里的限制是:
- 1 使用pymongo从数据库取数
- 2 取数的规则是根据某个id查询文件,根据更新时间倒排,然后只取第一个
mongo还是很方便用的,最近打算全面使用mongo了。因为pickle只适合在本地,不太适合分布式的执行。之前使用RabbitMQ的体验太差,我觉得基于mongo的队列应该比较靠谱。(反正我的任务一般都是长时间计算任务,那点IO消耗不算什么)
目前我使用的pymongo版本是3.11.0
,mongodb的版本4.4.2
(使用docker拉取了最新版)。
- 计数
假设已经获取了conn
# 1 整个集合(表)的记录数
some_count = collection.count_documents({})
# 2 计算某个条件的数量
some_count = collection.count_documents({'some_key': 'a123'})
- 获取
全部对象(注意:不要轻易这么干,如果mongo的某个库很大,这么干内存就爆了)
all_res = collection.find()
查询获得游标
some_one = collection.find({'some_key': 'abc123'}).sort('update_time', pymongo.DESCENDING)
其中some_one
就是游标
假设已经获取了conn
游标的结果可以认为是一个迭代器,有着类似tuple/list的特性
# cursor是一个迭代器,使用一次以后数据就释放了
all_res_list = list(all_res)
# 像列表一样取,迭代对象还在
print(some_one[0])
到这里已经可以获取数据了。
我看着mongo里原生的数据字段汇总有点麻烦,我觉得就把mongo当成一个快速存取的日志文件好了。例如如果要计算平均持续时间,就先取出来再计算。
假设已经获取了collection
# "_id":0表示不显示_id
all_res = collection.find({}, {"duration":1,"_id":0})
a1 = list(all_res)
# 如果要求汇总,可以借助pd.DataFrame塑形后计算
df1 = pd.DataFrame(a1)
df1['duration'].mean()