文章目录

  • Mongodb实现多表join
    • 1、通过遍历其他表,插入到当前表
    • 2、优化方式
      • 2.1、mongodb的lookup, 也就是聚合功能
      • 2.2、mapreduce 分布式join多表

Mongodb实现多表join

千万数量级的table, 如何实现join?

1、通过遍历其他表,插入到当前表

from pymongo import MongoClientclient = MongoClient("mongodb://192.168.123.64:27017/")
temp = client["gd_raw_data"]["temp"]
prplregistex = client["gd_raw_data"]["prplregistex"]
repairfee = client["gd_raw_data"]["repairfee"]
prplcitemcar = client["gd_raw_data"]["prplcitemcar"]
lossthirdparty_lossmain = client["gd_raw_data"]["lossthirdparty_lossmain"]
lossthirdparty = client["gd_raw_data"]["lossthirdparty"]
lossmain = client["gd_raw_data"]["lossmain"]
citemkind = client["gd_raw_data"]["citemkind"]
check = client["gd_raw_data"]["check"]query = {}
cursor = temp.find(query, no_cursor_timeout=True)
try:i = 0for doc in cursor:registno = doc['registno']print("报案号:{}".format(registno))prplregistex_info = prplregistex.find_one({ "registno": registno},no_cursor_timeout=True)repairfee_info = repairfee.find_one({ "registno": registno},no_cursor_timeout=True)prplcitemcar_info = prplcitemcar.find_one({ "registno": registno},no_cursor_timeout=True)lossthirdparty_lossmain_info = lossthirdparty_lossmain.find_one({ "registno": registno},no_cursor_timeout=True)lossthirdparty_info = lossthirdparty.find_one({ "registno": registno},no_cursor_timeout=True)lossmain_info = lossmain.find_one({ "registno": registno},no_cursor_timeout=True)citemkind_info = citemkind.find_one({ "registno": registno},no_cursor_timeout=True)check_info = check.find_one({ "registno": registno},no_cursor_timeout=True)newvalues = {"$set": {"prplregistex_info": prplregistex_info,"repairfee_info": repairfee_info,"prplcitemcar_info": prplcitemcar_info,"lossthirdparty_lossmain_info": lossthirdparty_lossmain_info,"lossthirdparty_info": lossthirdparty_info,"lossmain_info": lossmain_info,"citemkind_info": citemkind_info,"check_info": check_info}}temp.update_one({ "registno": registno}, newvalues)finally:client.close()

发现我的PC(i7 6代)实现1700万多表join需要125个小时,也就是5天5夜,中途服务器容易挂死。

2、优化方式

要么多线程,要么分布式

2.1、mongodb的lookup, 也就是聚合功能

操作之前请务必为关联的字段创建索引

db.getCollection("prplcmain").aggregate([{"$lookup": {"from": "lida","localField": "registno","foreignField": "registno","as": "carinfo"}},{"$lookup": {"from": "prpldriver","localField": "registno","foreignField": "registno","as": "prpldriver"}},{"$lookup": {"from": "prplinjured","localField": "registno","foreignField": "registno","as": "prplinjured"}},{"$lookup": {"from": "prplinsured","localField": "registno","foreignField": "registno","as": "prplinsured"}},{"$lookup": {"from": "regist","localField": "registno","foreignField": "registno","as": "regist"}},{"$out" : "total"}],{"allowDiskUse" : true}
);

这个相同配置下2个小时内可以搞定

2.2、mapreduce 分布式join多表

这个还没研究透彻
https://stackoverflow.com/questions/38882184/join-two-collections-with-mapreduce-in-mongodb

Mongodb实现多表join相关推荐

  1. 阿里规范不建议多表join,可这SQL要怎么写啊?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 前言 我们先来看一下阿里开发手册的描述 手册上写着[强制],但是肥 ...

  2. 阿里不让多表join?我偏要!

    作者:谢斌 http://blog.itpub.net/30393770/viewspace-2650450/ 提出问题和环境准备 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join ...

  3. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  4. mysql 多表 三表 删除_mysql 多表join查询索引优化

    数据准备 CREATE TABLE IF NOT EXISTS `class` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `card` int( ...

  5. 阿里不让 MySQL 多表 Join ?我偏要!

    一. 问题提出:<阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析:对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...

  6. sql join on 多表连接_阿里规范不建议多表Join,可这SQL要怎么写啊?

    前言 我们先来看一下阿里开发手册的描述: 手册上写着[强制],但是我相信很多同学项目里面的代码都不满足这个要求.但是关键问题是:不用join,这SQL究竟要怎么写啊! 高性能MySQL 高性能MySQ ...

  7. MySQL小表join大表的正确使用姿势(straight_join 关键字的使用)

    网上有种说法是:由于一般是采用小表join大表的方式(可以提高效率),所以有人说将小表放在左边,让它先执行,记住,这种说法是错误的!!!有例为证: 我们看上例: film inner join fil ...

  8. Flink异步io应用场景之流表join维表

    简介 维度表,作为数据仓库里面的概念,是维度属性的集合,比如时间维.地点维:可以是一个mysql或者cassandra,redis等存储,甚至是自己定义的一些api. 流表是kafka等流式数据. 根 ...

  9. Flink 实时计算 - 维表 Join 解读

    Flink 实时计算 - 维表 Join 解读 前言 Flink 1.9 版本可以说是一个具有里程碑意义的版本,其内部合入了很多 Blink Table/SQL 方面的功能,同时也开始增强 Flink ...

最新文章

  1. 用Transformer定义所有ML模型,特斯拉AI总监Karpathy发推感叹AI融合趋势
  2. 动态添加的面板不生效
  3. 网站首页head区代码规范
  4. 使用js技术使字体闪烁
  5. 为什么你总办不到大额信用卡?
  6. Unix/Linux/BSD 它们之间的关系以及各自派系的介绍
  7. 统计文章中字母出现频率
  8. php无限次执行函数,php-PHP一个方法根据传递值怎么执行多次?
  9. 现在程序员的工资是不是被高估了?不存在的!
  10. ShowSlow+Yslow环境搭建
  11. (转载)mysql书籍
  12. ReactJS基础(续)
  13. DSkin的TabControl在设计视图报错
  14. Windows10快速切换后台程序的快捷键!
  15. 吉安梵媛:人间最美是——原谅!
  16. Intraweb之EasyUI篇
  17. 高德开放平台地图Flutter插件的使用
  18. FastReport VCL 6.7.6 For Delphi10.4.2 安装图解教程
  19. EXCEL密码破解/破解工作表保护密码(详细图文教程)
  20. 2022年 微前端技术调研- 图文并茂

热门文章

  1. krsort函数怎么用php,krsort函数怎么用
  2. linux inotifywait脚本,使用inotify/fswatch构建自动监控脚本
  3. 虚拟磁盘类型_一起来了解一下Window10系统中虚拟硬盘的相关操作
  4. android学习资料_5G到来未来五年,纯应用的安卓开发者如何学习通过音视频破局?...
  5. nginx php返回500错误,nginx环境thinkphp,500错误
  6. 并发测试mysql_实践100个线程:一次MySQL数据并发问题
  7. python中向量长度_python中向量指的是什么意思
  8. python 不执行函数_解决python调用自己文件函数/执行函数找不到包问题
  9. 输入一个数判断是否对称java_判断对称矩阵 - osc_4mawo3g6的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 多选框位置调整_URPC 2019 水下目标检测竞赛冠军方案:多图像融合增强