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 }
在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"