ObjectId初探

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]: 
原文地址:https://www.cnblogs.com/standby/p/11647158.html