本帖最后由 cd紅丸 于 2012-06-20 01:34 編輯
4.5 _id keyMongoDB支持的數(shù)據(jù)類型中,_id是其自有產(chǎn)物,下面對其做些簡單的介紹。 存儲在MongoDB集合中的每個(gè)文檔(document)都有一個(gè)默認(rèn)的主鍵_id,這個(gè)主鍵名稱是固定的,它可以是MongoDB支持的任何數(shù)據(jù)類型,默認(rèn)是ObjectId。在關(guān)系數(shù)據(jù)庫schema設(shè)計(jì)中,主鍵大多是數(shù)值型的,比如常用的int和long,并且更通常的是主鍵的取值由數(shù)據(jù)庫自增獲得,這種主鍵數(shù)值的有序性有時(shí)也表明了某種邏輯。反觀MongoDB,它在設(shè)計(jì)之初就定位于分布式存儲系統(tǒng),所以它原生的不支持自增主鍵。 _id key舉例說明 : 當(dāng)我們在往一個(gè)集合中寫入一條文檔時(shí),系統(tǒng)會自動(dòng)生成一個(gè)名為_id 的key.如: > db.c1.find() { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 } { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 } |
這里多出了一個(gè)類型為ObjectId的key ,在插入時(shí)并沒有指定,這有點(diǎn)類似Oracle的rowid的信息,屬于自動(dòng)生成的。 在MongoDB中,每一個(gè)集合都必須有一個(gè)叫做_id的字段,字段類型默認(rèn)是ObjectId ,換句話說,字段類型可以不是ObjectId,例如: > db.c1.find() { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 } { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 } { "_id" : 3, "name" : "Bill", "age" : 55 } |
雖然_id的類型可以自由指定,但是在同一個(gè)集合中必須唯一,如果插入重復(fù)的值的話,系統(tǒng)將會拋出異常,具體如下: > db.c1.insert({_id:3, name:"Bill_new", age:55}) E11000 duplicate key error index: test.c1.$_id_ dup key: { : 3.0 } > |
因?yàn)榍懊嬉呀?jīng)插入了一條_id=3的記錄,所以再插入相同的文檔就不允許了。
-------------------------------------------------------------------
《MongoDB管理與開發(fā)精要》、《Redis實(shí)戰(zhàn)》作者
ChinaUnix.net專家 http://cdhongwan.blog.chinaunix.net
@CD紅丸 http://weibo.com/u/2446082491 |