2.4 mongo──交互式shell
mongo类似于MySQL中的mysql进程,但功能远比mysql强大,它可以使用JavaScript语法的命令从交互式shell中直接操作数据库。如查看数据库中的内容,使用游标循环查看查询结果,创建索引,更改及删除数据等数据库管理功能。下面是一个在mongo中使用游标的例子:
> for(var cur = db.posts.find(); cur.hasNext();) {
... print(tojson(cur.next()));
... }
输出:
{
"_id" : ObjectId("4bb311164a4a1b0d84000000"),
"date" : "Wed Mar 31 17:05:23 2010",
"content" : "blablablabla",
"author" : "navygong",
"title" : "the first blog"
}
...其它的documents。
2.5 一般功能
插入。客户端把数据序列化为BSON格式传给DB后被存储在磁盘上,在读取时数据库几乎不做什么改动直接把对象返回给客户端,由client完成unserialized。如:
> doc = {'author': 'joe', 'created': new Date('2010, 3, 28'), 'title':'Yet another blog post', 'text': 'Here is the text...', 'tags': ['example', 'joe'], 'comments': [{'author': 'jim', 'comment': 'I disgree'}, {'author': 'navy', 'comment': 'Good post'}], '_id': 'test_id'}
> db.posts.insert(doc)
查询。基本上你能想到的查询种类MongoDB都支持,如等值匹配,<,<=,>, >=,$ne,$in,$mod,$all,$size[1],$exists,$type[2],正则表达式匹配,全文搜索,......。还有distinct(),sort(),count(),skip()[3],group()[4],......。这里列表的查询中很多用法都和一般的RDBMS不同,在官网上可以获得全部的查询种类和使用方法。
删除。可以像查询一样指定条件来删除特定的文档。
索引。可以像在一般的RDBMS中一样使用索引。提供了建立(一般、惟一、组合)索引、删除索引、重建索引等各种方法。索引信息保存在集合“system.indexes”中。
map/reduce。MongoDB提供了map/reduce方法来进行数据的批处理及聚集操作。和Hadoop的使用类似,从集合中接收输入,结果输出到另一个集合。如果你需要使用group,map/reduce会是个不错的选择。但MongoDB中的索引和标准查询不是使用map/reduce,而是与MySQL相似,与CouchDB也不同。
map/reduce通过一个命令调用。数据库创建一个临时集合来存放操作的输出,当客户端连接关闭或显式地drop时这个集合就被清空。当然也可以指定一个已有的集合来持久存放输出。map/reduce函数以JaveScript语法的方式书写,在server端执行。
[1] 匹配一个有size个元素的数组。如db.things.find({a: {$size: 1}})能够匹配文档{a: ["foo"]}。
[2] 根据类型匹配。db.things.find({a : {$type : 16}})能够匹配所有a为int类型的文档。BSON协议中规定了各种类型对应的枚举值。
[3] 指定跳过多少个文档后开始返回结果,可以用在分页中。如:db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } )。
[4] 在sharded MongoDB配置环境中应该应该使用map/reduce来代替group()。