在web開發(fā)中,我們常常需要使用數(shù)據(jù)庫來存儲(chǔ)和管理數(shù)據(jù)。而PHP和MongoDB也是較為常用的技術(shù)。在MongoDB中,有一種獨(dú)特的數(shù)據(jù)類型——ObjectID,簡稱OID。OID是MongoDB內(nèi)部自動(dòng)生成的一種唯一標(biāo)識(shí)符,它用于在MongoDB中標(biāo)識(shí)每個(gè)文檔(document)的唯一性,以及在分布式系統(tǒng)中對(duì)數(shù)據(jù)的唯一性進(jìn)行確認(rèn)。
OID是通過以下方式生成的:
5e9085999cd8d95c8452d902 ^ ^ ^ 1 2 3
第一部分是一個(gè)4字節(jié)的值,表示時(shí)間戳,UTC時(shí)間。
第二部分是一個(gè)3字節(jié)的值,表示運(yùn)行MongoDB的機(jī)器。
第三部分是一個(gè)4字節(jié)的值,表示在同一個(gè)時(shí)間戳下生成的唯一ID。
在PHP中,有現(xiàn)成的MongoDB擴(kuò)展支持Oid數(shù)據(jù)類型。我們可以使用MongoId類來生成一個(gè)Oid實(shí)例:
$oid = new MongoId(); echo $oid; //輸出:5e95a33a6fb7350347fbaff7
還可以傳入一個(gè)16進(jìn)制字符串,從而創(chuàng)建一個(gè)已有的Oid實(shí)例:
$oid = new MongoId("5e95a33a6fb7350347fbaff7");
為了使得MongoDB查詢更加精確,我們可以通過Oid的屬性獲取其中的信息:
$oid = new MongoId("5e95a33a6fb7350347fbaff7"); $time = $oid->getTimestamp(); $machine = $oid->getHostname(); $increment = $oid->getInc(); echo "time: $time, machine: $machine, increment: $increment"; //輸出:time: 1586923610, machine: localhost, increment: 42997407
在查詢時(shí),我們可以使用Oid對(duì)象直接進(jìn)行匹配,例如查詢_id為5e95a33a6fb7350347fbaff7的文檔:
$oid = new MongoId("5e95a33a6fb7350347fbaff7"); $query = array("_id" =>$oid); $result = $collection->findOne($query);
MongoDB提供了一個(gè)特殊的"$in"操作符,可以一次匹配多個(gè)Oid的值:
$oids = array(new MongoId("5e95a33a6fb7350347fbaff7"), new MongoId("5e95a33a6fb7350347fbaff8")); $query = array("_id" =>array('$in' =>$oids)); $result = $collection->find($query);
在處理MongoDB查詢結(jié)果時(shí),我們也可以使用Oid對(duì)象獲取主鍵信息。
foreach ($result as $document) { $oid = $document['_id']; $time = $oid->getTimestamp(); $machine = $oid->getHostname(); $increment = $oid->getInc(); echo "time: $time, machine: $machine, increment: $increment"; }
最后值得一提的是,從MongoDB 3.2版本開始,Oid的生成算法發(fā)生了改變,以提高Oid的性能。如果需要使用舊版Oid格式,可以通過在MongoDB URI中加入"uuidRepresentation=standard"來進(jìn)行設(shè)置。
總的來說,Oid是MongoDB內(nèi)在的一種特殊類型,能夠提供精確唯一性的標(biāo)識(shí)符。在PHP中,使用MongoDB擴(kuò)展支持Oid類型操作非常方便,能夠有效提高我們的開發(fā)效率。