mongodb ISODate问题(大量数据update优化)
问题描述:
上周有个需求,把mongodb中birthday (ISO日期格式) 转换成北京时间,并保存成string类型。
最初思路:
遍历查找出的结果,逐个加8小时,然后通过_id逐个去update_one。但是发现这种方式效率太低了,一分钟才能更新一千五百条数据。
# -*- coding: utf-8 -*-
from pymongo import MongoClient
import time
import datetime def init():
myclient = MongoClient(host='*.*.*.*', port=27117)
# admin为登陆校验库
auth_db = myclient.admin
auth_db.authenticate('admin', '')
# 连接库
mydb = myclient['SR_123']
mycol = mydb['Data_170724145755025001_0305_copy4']
print(time.time())
count = 0
# 只取有birthday的数据,且只返回_id和birthday
for x in mycol.find({'birthday':{'$exists': True}},{'_id','birthday'}):
count = count + 1
print(count)
_time = x.get('birthday')
_time += datetime.timedelta(hours=8)
timeStr = _time.strftime("%Y%m%d")
_id = x.get('_id')
query1 = {"_id": _id}
newvalues = {"$set": {"birthdayStr": timeStr}}
mycol.update_one(query1, newvalues)
print(time.time()) init()
新的思路:
通过birthday去重,然后通过birthday去update_many。
for x in mycol.find().distinct('birthday'):
_time1 = x + datetime.timedelta(hours=8)
timeStr = _time1.strftime("%Y%m%d")
query1 = {"birthday": x}
newvalues = {"$set": {"birthdayStr": timeStr}}
mycol.update_many(query1, newvalues)
最终思路:
利用mongodb 的批量操作bulk_write,并且控制每次批量的数量,避免拼接过长报错。最终发现这种方式,当数据多的时候,效率远比上面两种方式快。
# -*- coding: utf-8 -*-
from pymongo import MongoClient
from pymongo import UpdateOne
import time
import datetime def init():
myclient = MongoClient(host='*.*.*.*', port=27117)
# admin为登陆校验库
auth_db = myclient.admin
auth_db.authenticate('admin', '1234')
# 连接库
mydb = myclient['SR_123']
mycol = mydb['Data_170724145755025001_0305_copy4']
print(time.time())
testList = []
i = 0
aa=mycol.find({'birthday': {'$exists': True}},{'_id','birthday'})
for x in aa:
i = i + 1;
_time = x.get('birthday')
_time += datetime.timedelta(hours=8)
try:
timeStr = _time.strftime("%Y%m%d")
except:
print(x)
_id = x.get('_id')
query1 = {"_id": _id}
newvalues = {"$set": {"birthdayStr": r''+timeStr}}
op = UpdateOne(query1, newvalues, upsert=True)
testList.append(op)
if( i % 50 == 0):
print(i)
mycol.bulk_write(testList, ordered=False, bypass_document_validation=True)
testList.clear() init()
mongodb ISODate问题(大量数据update优化)的更多相关文章
- OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置
https://xiaofandh12.github.io/Mongo-Shard 关于MongoDB MongoDB中的概念与关系型数据库之间的对应: Database --> Databas ...
- MongoDB 存储引擎和数据模型设计
标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...
- MongoDB中insert方法、update方法、save方法简单对比
MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...
- sql语句百万数据量优化方案
一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...
- Salesforce 超大量数据导入优化策略
本文参考自以下系列文章: 1 2 3 4 5 6 超大量数据导入优化策略 Salesforce和很多其他系统都可以很好的协作.在协作过程中,数据的导入导出便成为了一个关键的步骤. 当客户的业务量非常大 ...
- MongoDB 索引的使用, 管理 和优化
MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报 分类: MongoDB(9) [使用explain和hint] 前面讲高级查询 ...
- <搬运> SQL语句百万数据量优化方案
一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...
- MongoDB via Dotnet Core数据映射详解
用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事. 一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...
随机推荐
- Swift5 语言参考(四) 表达式
在Swift中,有四种表达式:前缀表达式,二进制表达式,主表达式和后缀表达式.评估表达式会返回一个值,导致副作用,或两者兼而有之. 前缀和二进制表达式允许您将运算符应用于较小的表达式.主要表达式在概念 ...
- 网络Socket编程TCP协议例子
1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...
- Android从零开始
Android开发环境的安装 1 IDE Android可以使用开发的IDE有Eclipse 或者 Android Studio.Android Studio还处于v 0.1.x版本,是early a ...
- Qt中QMenu的菜单关闭处理方法
Qt中qmenu的实现三四千行... 当初有个特殊的需求, 要求菜单的周边带几个像素的阴影, 琢磨了半天, 用QMenu做不来, 就干脆自己用窗口写一个 然而怎么让菜单消失却非常麻烦 1. 点击菜单项 ...
- unittest单元测试框架简单说明
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- 说说正则表达式的exec方法
话说,关于正则表达式有一个梗,大意是: 假如你有一个问题,想用正则来解决,于是你就有了两个问题 这句话侧面反映了精通正则是一件不容易的事.比如我今天遇到的诡异事件. 情景回放 这两天练手写了一个爬用户 ...
- C#基础篇五值类型和引用类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...
- [Python 从入门到放弃] 2. 列表的其它操作
1. 列表可以混合不同类型的数据项 movies=['<黄飞鸿之英雄有梦>','<寒战2>','<乘风破浪>'] 在这句代码中,数据项为电影名称,现在这个列表用来保 ...
- Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装
组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...
- webkit技术内幕读书笔记 (四)
资源缓存 资源缓存的目的是为了提高资源使用的效率,其基本思想是建立一个资源的缓存池,当需要请求资源的时候先去资源池查找是否有相应的资源,如果没有则向服务器发送请求,webkit收到资源后将其设置到该资 ...