MongoDB 插入时间与更新时间(create_time/update_time)
前言
- MongoDB 在数据库层面不能像 MySQL 一样设置自动创建 create_time/update_time,自动更新 update_time
- 可以自己封装函数在应用程序中实现类似效果
- 推荐学习唐建法《MongoDB 高手课》
本文测试环境
# 服务端 Ubuntu 18.04 LTS MongoDB 4.2.5 # 客户端 Windows 10 Python 3.8.2 pymongo 3.10.1
实例
# 类似 MySQL 以下语句,并更新时间
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
# 第一次执行时,生成 create_time 和 update_time
# 第二次执行时,更新 update_time
Mongo Shell
方式一
db.student.updateOne( { sno: 1 }, { $setOnInsert: { create_time: new Date() }, $set: { sname: "qbit", update_time: new Date() } }, { upsert: true } )
方式二(currentDate)
/* 约等于上面的语句。 通常下面的语句在新建 document 时, update_time 会比 create_time 晚一点。 因为 new Date() 是 js 函数,在客户端生成; currentDate 获取的是服务器时间 */ db.student.updateOne( { sno: 1 }, { $currentDate: { update_time: true }, $setOnInsert: { create_time: new Date() }, $set: { sname: "qbit" } }, { upsert: true } )
pymongo(reading-time)
Python 代码
#encoding: utf-8 #author: qbit #date: 2020-04-24 #summary: 封装 pymongo 函数,自动更新时间 import time from datetime import datetime, timedelta, timezone from pprint import pprint import pytz import pymongo from bson.codec_options import CodecOptions
def upsert_autotime(coll: pymongo.collection.Collection, filterDict: dict, updateDict: dict): r""" coll: MongoDB 集合 filterDict: 过滤条件,须是主键 updateDict: 更新字段内容 """ # 0 区 dt0 = datetime.utcnow() updateDict['update_time'] = dt0 updateDict = {'$set': updateDict} updateDict['$setOnInsert'] = { 'create_time': dt0 } return coll.update_one(filterDict, updateDict, upsert=True)
if __name__ == "__main__": username = 'qbit' password = 'xxx' host = '192.168.0.72' port = 27017 dbname = 'student' connStr = f'mongodb://{username}:{password}@{host}:{port}/{dbname}?authSource=admin' # 设置读取来时间的时区 options = CodecOptions(tz_aware=True, tzinfo=pytz.timezone('Asia/Shanghai')) db = pymongo.MongoClient(connStr).get_database(codec_options=options) coll = db.student coll.drop() filterDict = {"sno": 1} updateDict = {"sname": "qbit"} print('///////////////// 111 ///////////////////') upsert_autotime(coll, filterDict, updateDict) # 第 1 次执行 document = coll.find_one() document['create_time'] = document['create_time'].strftime('%Y-%m-%d %H:%M:%S') document['update_time'] = document['update_time'].strftime('%Y-%m-%d %H:%M:%S') pprint(document) print('///////////////// 222 ///////////////////') time.sleep(2) # 休眠 2s upsert_autotime(coll, filterDict, updateDict) # 第 2 次执行 document = coll.find_one() document['create_time'] = document['create_time'].strftime('%Y-%m-%d %H:%M:%S') document['update_time'] = document['update_time'].strftime('%Y-%m-%d %H:%M:%S') pprint(document)
运行结果
///////////////// 111 /////////////////// {'_id': ObjectId('5ea2acd4bb3447a6a5fe18fc'), 'create_time': '2020-04-24 09:09:39', 'sname': 'qbit', 'sno': 1, 'update_time': '2020-04-24 09:09:39'} ///////////////// 222 /////////////////// {'_id': ObjectId('5ea2acd4bb3447a6a5fe18fc'), 'create_time': '2020-04-24 09:09:39', 'sname': 'qbit', 'sno': 1, 'update_time': '2020-04-24 09:09:41'}
本文出自 qbit snap
qbit snap
开箱即用,拿走不谢。
262 声望
276 粉丝
推荐阅读
Postman 发送 RSA 签名请求(qbit)
前言Postman 版本 10.13.6qbit 将 RSAForPostman 压缩拷贝到了码云便于国内访问Postman 脚本示例Pre-request Script {代码...} Postman 内置库官方文档:[链接] {代码...} 本文出自 qbit snap
qbit阅读 122
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
王中阳Go赞 4阅读 1.7k评论 2
硬卷完了!MongoDB 打怪升级进阶成神之路( 2023 最新版 )!
前面我们学习:MySQL 打怪升级进阶成神之路、Redis 打怪升级进阶成神之路,然后我们还在继续 NoSQL 的卷王之路。从第一篇文章开始,我们逐步详细介绍了 MogoDB 基础概念、安装和最基本的CURD操作、索引和聚合、工...
民工哥赞 4阅读 284
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...
水冗水孚赞 4阅读 2.6k
MySQL百万数据深度分页优化思路分析
一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万...
一个程序员的成长赞 7阅读 868
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没...
京东云开发者赞 3阅读 571
Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。
ThinkSNS赞 1阅读 2.4k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。