MongoDB权威指南(6)- 高级主题
?
1.数据库命令
mongoDB提供了范围广泛的数据库命令,覆盖了除create,read,update,delete之外的所有功能。比如我们前边用到的getLastError命令,用来查看update时受影响的数量。
命令是如何工作的
这里有个你比较熟悉的例子:drop,如果从shell里删除一个collection,我们运行db.test.drop().实际上,在内部执行的是drop命令,跟下边用runCommand执行的操作是一样的
2.Capped Collections
mongoDB还支持一种特殊的collection叫Capped Collections,这种collection是事先创建并且是大小固定的。固定大小就带来了一个问题,如果collection满了之后对其执行插入该如何处理。Capped Collection的工作方式像一个循环队列,如果空间用完了,那么最旧的数据会被删除掉,新数据会取代旧数据的位置。这就是说,随着新 document的插入,最旧的document会自动消亡。
某些操作在Capped Collection上是不允许执行的。不允许执行document删除,也不允许执行会导致document移动的更新(使document变大的更新),这样就可以保证Capped Collections里的document是按照插入顺序存储的。
特性和用例
Capped Collection的这些特点和限制会产生有趣的特性。首先是插入很快,执行插入的时候不再需要分配空间,服务器就不用查询空闲列表,插入的 document直接放在collection的尾部。缺省情况下,也不会更新索引,所以一次插入本质上就是一次内存拷贝。另外一个特性是,按插入顺序查询很快,document是按照插入顺序存储的,只需要按它们在磁盘上的顺序遍历。最后,旧数据的自动消亡也是个有用的特性。包括了上述3个特性的 Capped Collection对某些用例特别适用,如日志,实际上Capped Collection原本就是设计来存储内部复制日志的。另外还有个好的用例,缓存小规模的document。
创建Capped Collections
> 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" }>来源:http://www.open-open.com/lib/view/open1328162079109.html