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]: