ObjectId

MongoDB每个集合存储的每个文档必须有一个"_id"键,默认是个ObjectId对象。

"_id"作为当前文档在集合的唯一标识。

71standby:PRIMARY> db.accesslog.find({},{_id:1}).pretty()
{ "_id" : ObjectId("5d1d7225d06339b452d964f6") }
{ "_id" : ObjectId("5d1d7225d06339b452d964f7") }
{ "_id" : ObjectId("5d1d7225d06339b452d964f8") }
{ "_id" : ObjectId("5d1d7226d06339b452d964fa") }
{ "_id" : ObjectId("5d1d7226d06339b452d964fb") }
{ "_id" : ObjectId("5d1d7226d06339b452d964fc") }
{ "_id" : ObjectId("5d1d72acd06339b452d964fe") }
{ "_id" : ObjectId("5d1d72acd06339b452d964ff") }
{ "_id" : ObjectId("5d1d72acd06339b452d96500") }
71standby:PRIMARY>

ObjectId是有12字节组成的,其前面4字节表示的是文档创建的时间戳(比北京时间晚了 8 个小时)

在 mongo shell 里可以通过 ObjectId.getTimestamp() 来查看文档创建时间。

71standby:PRIMARY> x = ObjectId()
ObjectId("5d9ea85b7444a82a869f958f")
71standby:PRIMARY> x
ObjectId("5d9ea85b7444a82a869f958f")
71standby:PRIMARY> x.getTimestamp()
ISODate("2019-10-10T03:41:15Z")
tvos-mediacenter-rs1:PRIMARY>

时间转换

以 "5d9ea85b7444a82a869f958f" 为例:

# 1字节等于8bit,而一个十六进制数可以由4bit表示,所以两个十六进制数可以表示一个字节

# 所以前4个字节则是前面8个16进制数。

In [25]: import time                                                                                                                                                                                                                      

In [26]: key = '5d9ea85b7444a82a869f958f'                                                                                                                                                                                                 

In [27]: ts = int(key[:8],16)       # 16进制转10进制                                                                                                                                                                                                      

In [28]: ts
Out[28]: 1570678875 In [29]: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts))
Out[29]: '2019-10-10 11:41:15' # 比UTC时间早8个小时 In [30]: hex(ts) # 10进制转16进制
Out[30]: '0x5d9ea85b' In [31]: In [32]: 11*16**0 + 5*16**1 + 8*16**2 + 10*16**3 + 14*16**4 + 9*16**5 + 13*16**6 + 5*16**7
Out[32]: 1570678875 In [33]:

Convert BSON to JSON

In [13]: doc
Out[13]:
{'_id': ObjectId('54d9a762ab4f16f448312863'),
'artist': '后街男孩',
'cover': 'http://img5.douban.com/lpic/s2512539.jpg',
'song': 'Everbody'} In [14]: import json In [15]: from bson.json_util import dumps In [16]: dumps(doc)
Out[16]: '{"_id": {"$oid": "54d9a762ab4f16f448312863"}, "artist": "\\u540e\\u8857\\u7537\\u5b69", "cover": "http://img5.douban.com/lpic/s2512539.jpg", "song": "Everbody"}' In [17]: json.loads(dumps(doc))
Out[17]:
{'_id': {'$oid': '54d9a762ab4f16f448312863'},
'artist': '后街男孩',
'cover': 'http://img5.douban.com/lpic/s2512539.jpg',
'song': 'Everbody'} In [18]:

ObjectId初探的更多相关文章

  1. zabbix报警逻辑初探

    zabbix报警逻辑初探 首先贴出一张网上找的一张关于zabbix报警相关表结构及表关联逻辑图: actions表 actions表对应前端配置是动作(actions) action由conditio ...

  2. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  3. MongoDB数据实体中的ObjectId序列化成json的一个小坑

    很多时候我们都需要对实体对象进行序列化与反序列化,而ObjectId类型,只能用mongo的驱动以bson格式来序列化,但我们对外的交互,一般是json格式. 有两种解决方案: 1.自己写一个json ...

  4. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  5. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  6. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  7. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  8. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  9. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

随机推荐

  1. web开发: css高级与盒模型

    一.组合选择器 二.复制选择器优先级 三.伪类选择器 四.盒模型 五.盒模型显示区域 六.盒模型布局 一.组合选择器 <!DOCTYPE html> <html> <he ...

  2. [Abp vNext微服务实践] - vue-element-admin登录一

    简介 之前的技术路线本来是angular的,后来经过一段时间的开发还是打算选择vue,原因是vue简单丰富,尽管angular规范强大,但是组件库都不太符合国人风格.看到GitHub上Vue Elem ...

  3. 如何通过字符串形式导包(importlib模块的使用)

    1 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定 ...

  4. UVA10900 So you want to be a 2n-aire?

    So you want to be a 2n-aire? PDF 在一个电视娱乐节目中,你一开始有1元钱.主持人会问你n个问题,每次你听到问题后有两个选择:一是放弃回答该问题,退出游戏,拿走奖金:二是 ...

  5. Java笔记(第六篇-网络通信)

    TCP/IP模式是一种层次结构,共分为四层,分别为应用层.传输层.互联网层和主机到网络层. 在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即“传输控制协议”(TCP)与“用户数 ...

  6. <script language= "javascript " for= "window " event= "onload ">

    狼-志 EVENT   event   设置或获取脚本编写用于的事件   FOR   htmlFor   设置或获取绑定到事件脚本的对象. 可以这样理解. <script   language= ...

  7. 长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&&水题

    题目 链接 题意:给出x数列的定义: $T_0 = a$ $T_1 = b$ $T_n = T_{n-2} \bigoplus T_{n-1} $ 求第 $n$ 项( $0 \leqslant a,b ...

  8. 题解 [BZOJ1925][SDOI2010] 地精部落

    题面 解析 这个似乎并不好讲啊 设\(f[i][j]\)表示有\(i\)座山, 最后一座山到达高度是\(i\)座中第\(j\)大的, 且最后一座山是山谷. 注意,\(i\)是代表有\(i\)座山,并不 ...

  9. shell拷贝文件到另一台机器

    #!/bin/bash data=$(date "+%Y-%m-%d %H:%M:%S") ip='192.168.10.14' password='fan' gitBak='/v ...

  10. ttf-mscorefonts-installer 无法安装,解决办法

    ttf-mscorefonts-installer 无法安装,解决办法 原 lieefu 发布于 2017/01/11 08:11 字数 163 阅读 1007 收藏 0 点赞 0 评论 0 面试:你 ...