日期:2014-05-16  浏览次数:20450 次

MongoDB 实战笔记 二

?

MongoDB ?实战笔记

?

count 查询记录条数

db.users.find().count();?

?

以下返回的不是 5,而是 user 表中所有的记录数量

db.users.find().skip(10).limit(5).count();?

?

如果要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)?

db.users.find().skip(10).limit(5).count(true);

?

?

从第 3 条记录开始,返回 5 条记录(limit 3, 5)?

db.users.find().skip(3).limit(5);

?

以年龄升序 asc?

db.users.find().sort({age: 1});?

以年龄降序 desc?

db.users.find().sort({age: -1});

?

MongoDB 也是用游标来循环处理每一条结果数据,具体语法如

下:

> for( var c = db.t3.find(); c.hasNext(); ) {?

... ? ?printjson( c.next());?

... }

MongoDB 还有另一种方式来处理游标

> db.t3.find().forEach( function(u) { printjson(u); } );

?

MongoDB 同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用 javascript 来

写的。也许这会让你很奇怪,为什么它用 javascript 来写,但实际上它会让你非常满意,

MongoDB 存储过程是存储在 db.system.js 表中的,我们想象一个简单的 sql 自定义函数如下:

function addNumbers( x , y ) {?

? ? return x + y;?

}

下面我们将这个 sql 自定义函数转换为 MongoDB 的存储过程:?

> db.system.js.save({_id:"addNumbers", value:function(x, y){ return x + y; }});

调用一下这个存储过程:?

> db.eval('addNumbers(3, 4.2)');?

7.2

?

db.eval()是一个比较奇怪的东西,我们可以将存储过程的逻辑直接在里面并同时调用,而无

需事先声明存储过程的逻辑。

> db.eval( function() { return 3+3; } );?

6

?

1、logging?

MongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数

据库中。在一个没有索引的 capped collection 中插入对象的速度与在文件系统中记录日

志的速度相当。

2、cache?

缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在 collection 上建立

一个索引,因为使用缓存往往是读比写多。

3、auto archiving?

可以利用 capped collection 的 age-out 特性,省去了写 cron 脚本进行人工归档的工作

?

1、 为了发挥 capped collection 的最大性能,如果写比读多,最好不要在上面建索引,否则

插入速度从"log speed"降为"database speed"。

2、使用"nature ordering"可以有效地检索最近插入的元素,因为 capped collection 能够保证

自然排序就是插入时的顺序,类似于 log 文件上的 tail 操作。

?

删除MongoDB Windows服务

>mongod.exe --remove

(http://blog.csdn.net/xiaochunyong/article/details/7730841)

?

mongofiles put testfile

mongofiles list

?

db.fs.files.find()

{ "_id" : ObjectId("4fc60175c714c5d960fff76a"), "filename" : "testfile", "chunkSize" : 262144,?

"uploadDate" : ISODate("2012-05-30T11:16:05.745Z"), "md5" :?

"8addbeb77789ae6b2cb75deee30faf1a", "length" : 16 }

?