最近在工程上遇到MongoDB表增量复制到另一个表的问题。需求是因为原表的数据会定时删除,而目前想要保存原表的数据。简单理解为:原表删,新表不删。原表增,新表增。

使用MongoShell很容易解决:
将一个实例的表复制到另一个实例的表(同一个数据库)

db.collection_name.find().forEach(function(d){db.getSiblingDB('new_database')['collection_name'].insert(d);})

collection_name:数据库表名
new_database:目标数据库

而使用pymongo时通过update实现:
mongodb文档
关键在于upsert参数设置:为True时,如果没有匹配的文档,则创建一个新文档

核心代码:

for doc in orgin_collections["cursor"]["firstBatch"]:#将原表数据增量复制到备份表mongo_db.command('update', update=MONGO_COPY_TABLE, updates=[{"q": doc, "u": doc, "upsert": True}],bypassDocumentValidation=True)

全部代码:

import pymongo
import time
import datetime
"""
配置参数
"""
MONGO_IP = '192.168.1.103'
MONGO_PORT = 27017
#刷新同步时间 秒
SHUFFLE_TIME = 60
#数据库名
MONGO_DATABASE = 'things'
#原始表名
MONGO_ORIGIN_TABLE = 'things_journal'
#备份表名
MONGO_COPY_TABLE = 'cauc_test'#历史数据,为了判断是否要同步
OLD_DATA = ''"""
连接到数据库
"""
mongo_client = pymongo.MongoClient(MONGO_IP, MONGO_PORT)
mongo_db = mongo_client[MONGO_DATABASE]"""
复制表数据函数
"""
def copyNewTable():#获取原表数据global OLD_DATAorgin_collections = mongo_db.command('find', find=MONGO_ORIGIN_TABLE, skip=0)if OLD_DATA == orgin_collections:#原表无更新print("[{}] {}没有变化,暂不同步".format(datetime.datetime.now(), MONGO_ORIGIN_TABLE))else:#原表有更新OLD_DATA = orgin_collectionsfor doc in orgin_collections["cursor"]["firstBatch"]:#将原表数据增量复制到备份表mongo_db.command('update', update=MONGO_COPY_TABLE, updates=[{"q": doc, "u": doc, "upsert": True}],bypassDocumentValidation=True)print("[{}] {}已同步到{}".format(datetime.datetime.now(),MONGO_ORIGIN_TABLE,MONGO_COPY_TABLE))if __name__ == '__main__':while(1):copyNewTable()time.sleep(SHUFFLE_TIME)

输出结果:

pymongo实现表增量复制相关推荐

  1. linux集群自动化脚本和增量复制

    linux集群自动化脚本和增量复制 Linux集群shell自动化脚本和集群增量增量复制 xcall.sh代码: xcall.sh脚本解释: xsync.sh代码: xsync.sh脚本解释: 自定义 ...

  2. sql server快照复制mysql_SQL SERVER 数据库表同步复制 笔记

    SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据.无人值守.故障自动恢复.同构/异构数据库同步.断点续传和增量同步等功能,支持 ...

  3. 两个表的更新、表的复制

    update 表1 set  from 表1,表2 where 条件 表的复制数据 1.select * into newtable from table 2.insert into table se ...

  4. dbgridview内操作粘贴,复制,等量复制,增量复制

    1.    复制 DataGridViewSelectedCellCollection ds; ds = dataGridView1.SelectedCells; DataGridViewSelect ...

  5. 《Oracle SQL疑难解析》——1.6 批量地从一个表中复制数据到另一个表

    本节书摘来自异步社区出版社<Oracle SQL疑难解析>一书中的第1章,第1.6节,作者: [美]Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以 ...

  6. SQLSERVER2000同表数据复制(部分复制)

    在项目中可能需要用到同表数据复制,如:两笔记录除了日期和ROWID(自动编号)其他数据均是一模一样,一般的办法就是读取出来然后再插进去,即使写到存储过程里面也一样需要执行两条SQL语句,效率也比较低的 ...

  7. update 两个表关联_你真的了解全量表,增量表及拉链表吗?

    1 Mysql数据准备 第一天 9月10号数据 1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:112,待支付,2020-09-10 14:20:11,2020- ...

  8. 全量复制 增量复制 异步复制

    全量复制 master执行bgsave,在本地生成一份rdb快照文件 master node将rdb快照文件发送给salve node,如果rdb复制时间超过60秒(repl-timeout),那么s ...

  9. 计算机基础知识excle,职称计算机基础知识:Excel工作表的复制

    (1)在工作簿内部复制 1)鼠标拖曳法 将鼠标指针指向被复制的工作表标签,按下Ctrl键,按下鼠标,此时鼠标指针变成内含"十"字形的表的图标,同时旁边的黑色倒三角用以指示工作表的复 ...

最新文章

  1. 关于python中的dict和defaultdict
  2. Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
  3. visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析
  4. 解决IDEA不能编译XML文件
  5. WORD表格中文字显示不完整怎么办?
  6. Linux的Open Files设置过小导致程序退出并且Unable to create new native thread
  7. mysql5.7.17完全卸载_MySQL5.7完全卸载步骤详解
  8. 零基础带你学习MySQL—自连接(二十一)
  9. Linux Bash严重漏洞修复紧急通知
  10. 转载--认识迅雷界面引擎
  11. win10默认壁纸_小白个人系统安装美化(二)win10系统美化设置篇
  12. js 56个民族 数据
  13. 记录一些遇见的bug——Lombok和Mapstruct的冲突导致,A component required a bean of type ‘com.XXX.controller.converter.
  14. ThingsBoard 仪表板状态
  15. 2019拼多多前端笔试题
  16. python下对bin文件的处理
  17. 产品调研,如何避免「浮于表面」?
  18. canvas乱码的处理
  19. Yii:zii.widgets.CMenu使用方法
  20. leakcanary内存泄露检测工具 Dumping memory, app will freeze. Brrr

热门文章

  1. 《第八届全国大学生GIS应用技能大赛》——一个普通二本院校参赛学生的收获以及评委老师所给的建议
  2. 某瓣_sig参数逆向破解
  3. oracle wip 常见问题,Oracle WIP设置步骤
  4. 【websocket】socket.io 例子:chat服务
  5. finereport php,FineReport与Web集成
  6. 如何在抖音讲故事月赚10w,抖音故事玩法实战分享
  7. Moonbeam 生态说|Web3健身:MoonFit
  8. Planner 5D for Mac(室内家居设计软件)
  9. oracle response配置,用response文件silent模式安装和配置oracle10g
  10. 分布式链路监控与追踪系统(SpringCloud Sleuth + Zipkin)