from:http://blog.csdn.net/haha_mingg/article/details/8048422
MongoDB除了包含這些string, integer, boolean, double, null, array, and object基本的資料類型外,還包含:date, object id, binary data, regular expression, and code這些附加的資料類型。
1. Timestamp類型
Timestamp類型從1.8版本開始支援,Timestamp有一個特殊的用法:timestamp類型的欄位必須是位於文檔的前兩位.看下面例子: //位於第三個欄位 > db.coll.insert({_id:1,x:2,y:new Timestamp()}); > db.coll.findOne({_id:1}); { "_id" : 1, "x" : 2, "y" : { "t" : 0, "i" : 0 } } //位於第二個欄位 > db.coll.insert({_id:2,y:new Timestamp(),x:2}); > db.coll.findOne({_id:2}); { "_id" : 2, "y" : { "t" : 1306746538000, "i" : 1 }, "x" : 2 }
2. ObjectId類型
在mongodb中,幾乎每個文檔(除了某些系統的Collection或者某些Capped Collection)都要求有一個主鍵:_id,用來唯一標識他們,通常—它的值就是ObjectId類型。當使用者往文檔中插入一條新記錄的時候,如果沒有指定_id屬性,那麼MongoDB會自動產生一個ObjectId類型的值,儲存為_id的值。 _id的值可以為任何類型,除了數組,在實際應用中,鼓勵使用者自己定義_id值,但是要保證它的唯一性。如下有兩個方案:
2.1 Sequence Numbers:序號
傳統的資料庫中,通常用一個遞增的序列來提供主鍵,在MongoDB中用ObjectId的來代替,我們可以通過如下的函數來擷取主鍵: function counter(name) { var ret = db.counters.findAndModify({query:{_id:name}, update:{$inc : {next:1}}, "new":true, upsert:true}); return ret.next; } db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1 db.users.insert({_id:counter("users"), name:"Bob D."}) // _id :2
2.2 利用UUID
如果用UUID來提供主鍵,我們的應用需要自己去產生UUID,考慮到效率,建議把UUID儲存為BSON BinData類型,如果用例中對效率要求不是很高,也可以儲存為字串類型。
3. 資料庫關聯
在MongoDB中,通常的關聯習慣有兩種,一種是簡單的手動關聯,一種是用DBRef。
3.1簡單的手工關聯 //尋找
> db.post.save({title:'MongoDB Manual',author:'sam'});
> p = db.post.findOne(); { "_id" : ObjectId("4de36b33282677bdc555a83a"), "title" : "MongoDB Manual", "author" : "sam" } //關聯
> db.authors.findOne({name:p.author}); { "_id" : ObjectId("4de36c14282677bdc555a83b"), "name" : "sam", "age" : 24, "email" : "sanlai_lee@lisanlai.cn" } 3.2利用DBRef關聯
DBRef關聯文法:
{ $ref : <collname>, $id : <idvalue>[, $db : <dbname>] }
例子:
> x = { name : 'Biology' } { "name" : "Biology" }
> db.courses.save(x)
> x { "name" : "Biology", "_id" :
ObjectId("4b0552b0f0da7d1eb6f126a1") }
> stu = { name : 'Joe', classes : [ new DBRef('courses', x._id) ] } // or we could write: // stu = { name : 'Joe', classes : [ {$ref:'courses',$id:x._id} ] }
> db.students.save(stu)
> stu { "name" : "Joe", "classes" : [ { "$ref" : "courses", "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") } ], "_id" : ObjectId("4b0552e4f0da7d1eb6f126a2") }
> stu.classes[0] { "$ref" : "courses", "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") }
> stu.classes[0].fetch() { "_id" : ObjectId("4b0552b0f0da7d1eb6f126a1"), "name" : "Biology"