问题描述:

  上周有个需求,把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优化)的更多相关文章

  1. OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置

    https://xiaofandh12.github.io/Mongo-Shard 关于MongoDB MongoDB中的概念与关系型数据库之间的对应: Database --> Databas ...

  2. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  3. MongoDB中insert方法、update方法、save方法简单对比

    MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  5. sql语句百万数据量优化方案

    一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...

  6. Salesforce 超大量数据导入优化策略

    本文参考自以下系列文章: 1 2 3 4 5 6 超大量数据导入优化策略 Salesforce和很多其他系统都可以很好的协作.在协作过程中,数据的导入导出便成为了一个关键的步骤. 当客户的业务量非常大 ...

  7. MongoDB 索引的使用, 管理 和优化

    MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报  分类: MongoDB(9)  [使用explain和hint] 前面讲高级查询 ...

  8. <搬运> SQL语句百万数据量优化方案

    一:理解sql执行顺序 在sql中,第一个被执行的是from语句,每一个步骤都会产生一个虚拟表,该表供下一个步骤查询时调用,比如语句:select top 10 column1,colum2,max( ...

  9. MongoDB via Dotnet Core数据映射详解

    用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事.   一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...

随机推荐

  1. Swift5 语言参考(四) 表达式

    在Swift中,有四种表达式:前缀表达式,二进制表达式,主表达式和后缀表达式.评估表达式会返回一个值,导致副作用,或两者兼而有之. 前缀和二进制表达式允许您将运算符应用于较小的表达式.主要表达式在概念 ...

  2. 网络Socket编程TCP协议例子

    1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...

  3. Android从零开始

    Android开发环境的安装 1 IDE Android可以使用开发的IDE有Eclipse 或者 Android Studio.Android Studio还处于v 0.1.x版本,是early a ...

  4. Qt中QMenu的菜单关闭处理方法

    Qt中qmenu的实现三四千行... 当初有个特殊的需求, 要求菜单的周边带几个像素的阴影, 琢磨了半天, 用QMenu做不来, 就干脆自己用窗口写一个 然而怎么让菜单消失却非常麻烦 1. 点击菜单项 ...

  5. unittest单元测试框架简单说明

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  6. 说说正则表达式的exec方法

    话说,关于正则表达式有一个梗,大意是: 假如你有一个问题,想用正则来解决,于是你就有了两个问题 这句话侧面反映了精通正则是一件不容易的事.比如我今天遇到的诡异事件. 情景回放 这两天练手写了一个爬用户 ...

  7. C#基础篇五值类型和引用类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...

  8. [Python 从入门到放弃] 2. 列表的其它操作

    1. 列表可以混合不同类型的数据项 movies=['<黄飞鸿之英雄有梦>','<寒战2>','<乘风破浪>'] 在这句代码中,数据项为电影名称,现在这个列表用来保 ...

  9. Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  10. webkit技术内幕读书笔记 (四)

    资源缓存 资源缓存的目的是为了提高资源使用的效率,其基本思想是建立一个资源的缓存池,当需要请求资源的时候先去资源池查找是否有相应的资源,如果没有则向服务器发送请求,webkit收到资源后将其设置到该资 ...