【知识小课堂】 mongodb 之 objectId
?一、OBJECTID
因公司開發(fā)人員在使用MONGODB時,總遇到一些小問題。為了增加大家的mongodb 數(shù)據(jù)庫知識。
決定每周進行一、兩次的知識小課堂。這里把內(nèi)容整理出來,上傳到博客中。也算是自己的一個mongodb 歷程吧
1.1 結(jié)構(gòu)
ObjectId("52cbab42231dea1e819b2a37"),
ObjectId("52cbab5b231dea1e819b2a38"),
ObjectId("52cbab70231dea1e819b2a39"),
52cbab70 ??? ?時間戳
231dea?? ??? ?機器號
1e81?? ??? ?進程ID
9b2a39?? ?自增數(shù)
以上數(shù)字為 16進制表示
特點:
1.24個16進制數(shù)據(jù),使用 12字節(jié)的存儲空間。
2.最后3個字節(jié)為:自動增長??纱_保每秒生成的值也不一樣,一秒最多允許每個進程擁有256^3個不同ObjectId
(后面3位16進制存在量可以達(dá)到: 16,777,216
也可以從存儲量計算出來 FFFFFF 轉(zhuǎn)換成10進制就是16,777,215)
3.可轉(zhuǎn)移到客戶端生成,而減輕服務(wù)器負(fù)擔(dān)(需要客戶端的驅(qū)動程序)
下面介紹幾個相關(guān)的函數(shù)
函數(shù)說明:
1.Str 功能 與valueOf()相同
2.toString()? 把一個對象轉(zhuǎn)換成
了一字串。這時兩個objectId可以對比。
3.getTimestamp() 抽取 時間
我們再來看看一個有意思的查詢:
既然可以把從objectId 獲取日期,那我是否可以使用一個日期做為條件,使用_id 字段來進行查詢呢。
我的方法是?
?使用 函數(shù)? getTimestamp()先把字段 進行處理,這在一般的關(guān)系型數(shù)據(jù)庫非常常用。<span style="font-size:18px;">> a = db.order.findOne() {"_id" : ObjectId("5331128631a4804b226471e4"),"md5" : "cacae8722c325d62e795e5c273d5f49b",…… } > a."_id" Wed Jul 2 14:50:57.494 SyntaxError: Unexpected string > a._id.getTimestamp() ISODate("2014-03-25T05:22:14Z") > new Date("2014,03,25") ISODate("2014-03-24T16:00:00Z") > new Date("2014,03,25") ISODate("2014-03-24T16:00:00Z") > db.order.find({"_id.getTimestamp()":{$gt:new Date("2014,03,25")}}).count() 0 > db.order.find({_id.getTimestamp():{$gt:new Date("2014,03,25")}}).count() Wed Jul 2 14:54:00.298 SyntaxError: Unexpected token . > </span>
可以看到,看來是行不通。mongodb 無法識別 處理后的字段。
那只能自己生成一個objectId 再進行對比了。
我以前一直以為是無法進行兩個 objectId 來進行對比的。
但查詢了官方資料。并沒有看到相關(guān)按時間生成新的objectID 的方法/函數(shù)。
(http://docs.mongodb.org/manual/reference/method/)
后來找到了開發(fā)牛人的一個便方,解決了此問題。代碼如下:
其它方法也比較簡單,就是把一個日期轉(zhuǎn)換成16進制后,替換到一個新生成的objectId 中去。
當(dāng)自己構(gòu)造好一個objectId后,后面我們來使用它進行查詢:
可以看到,查詢結(jié)果出來了。從上面可以看出。兩個objectId 是可以進行對比的。
從上面示例代碼看到
雖然可以從ojbectId 中提取一些信息。但如果要使用 objectid中的信息來做為查詢條件,相對還是比較麻煩的。
就象我上面的,如果我要從objectID 的建立日期 來做為查詢條件,我自己得先用查詢時間構(gòu)建一個objectID,然后再進行查詢。
如果查詢條件還有范圍什么的。還不如再建立一個字段create_dt 來保存記錄的建立時間。以后查詢統(tǒng)計用此字段,還更方便。
我們再來看看查詢的計劃,看到已使用了索引,此計劃雖然不能說明什么。但也可以讓我知道是用_id 字段的索引。
總結(jié)
以上是生活随笔為你收集整理的【知识小课堂】 mongodb 之 objectId的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用两种不同的方法导出ORACLE 查询数
- 下一篇: 【知识小课堂】 mongodb 之字段中