MongoDB高级部分及实现(二)
MongoDB是由C++语言所编写的一种面向文档的非关系型数据库(是一种NoSql数据库实现),也是介于关系型数据库和非关系型数据库之间的数据存储产品,其提供了高性能、高可用、高可拓展及基于分布式存储的数据库,是非关系型数据库中功能最丰富,最类似关系型数据库的一种集合、文档格式的数据库。
l 正则使用
l 管理工具
l 固定集合
l 自动赠长
一、正则使用
对于正则表达式,我想大家并不陌生,它就是一个单字符串规则,使用它来匹配一系列满足该规则的字符串内容,很多程序语言都对其支持。而在MongoDB中,其使用了$regex操作符来设置字符串的正则表达式规则,也是使用了PCRE作为正则的语言,具体如下所示:
1、文档准备
{
"_id" :ObjectId("57e89b3ab316d2e13cc0ba9c"),
"orderno" : "YD000001",
"title" : "席梦思抱枕一对",
"oriprice" : 80,
"discount" : "0.70",
"saleprice" : "56.00",
"type" : "居家",
"coupon" : 0
}
{
"_id" :ObjectId("57e89bcfb316d2e13cc0ba9d"),
"orderno" : "YD000002",
"title" : "席梦思抱软硬适中床垫",
"oriprice" : 280,
"discount" : "0.80",
"saleprice" : "224.00",
"type" : "居家",
"coupon" : 0
}
{
"_id" : ObjectId("57eb72420cf7e671c6c9339b"),
"orderno" : "YD000003",
"title" : "鲍鱼",
"oriprice" : 180,
"discount" : "0.80",
"saleprice" : "124.00",
"type" : "饮食",
"coupon" : 0
}
2、如何使用
这里以查询包含“席梦思”字符串的文档的信息,具体如下使用:
> db.order.find({title:{$regex:"席梦思"}})
或者
> db.order.find({title:/席梦思/})
返回结果:
{ "_id" :ObjectId("57e89b3ab316d2e13cc0ba9c"), "orderno" :"YD000001", "title" : "席梦思抱枕一对", "oriprice" : 80,"discount" : "0.70", "saleprice" :"56.00", "type" : "居家", "coupon" : 0 }
{ "_id" : ObjectId("57e89bcfb316d2e13cc0ba9d"),"orderno" : "YD000002", "title" : "席梦思抱软硬适中床垫", "oriprice" : 280,"discount" : "0.80", "saleprice" :"224.00", "type" : "居家", "coupon" : 0 }
注意:
如果所查询的匹配关键字含有字母,需要大小写区分时,可以这样编写:
> db.order.find({title:{$regex:"Javla",$options:"$i"}})
此时,查询结果返回的是不区分大小的记录信息,这里不介绍。
3、正则优化
如果你的文档中字段设置了索引,那么使用索引相比于正则表达式匹配查找所有的数据查询速度更快。如果正则表达式是前缀表达式,所有匹配的数据将以指定的前缀字符串为开始。例如:如果正则表达式为 ^abc ,查询语句将查找以 abc 为开头的字符串,所有正则具有的特性,在MongoDB中都可适用。
二、管理工具
这里要介绍的MongoDB管理工具是RockMongo,其是由PHP5语言编写,类似于phpMyAdmin(PHP开发的Mysql管理工具),而RockMongo工具,可以管理MongoDB的服务、数据库、集合、文档及索引等等。该工具目前更新较慢,但现有的版本能够满足大多的需求服务,还算比较方便。
1、下载安装
A、下载地址
http://rockmongo.com/downloads
B、安装配置
>将下载的压缩包,放入网站根目录下;
>边界config.php,修改host、port、admins等参数;
>打开浏览器,访问index.php,比如:
http://localhost/rockmongo/index.php
>输入用户名和密码登录,默认为admin和admin
>进入使用即可
2、如何使用
经过上面安装配置后,需要你启动管理的mongo服务,首先进入登录页:
这里,我以默认的帐号密码为例进行登录,实际使用中需要修改真实的用户名和密码哦!登录之后的页面如下:
怎么样?页面效果比较清晰,提供的功能也比较丰富,我们可以在上面查看自己的数据库实例,选中浏览集合即可查看到其中的文档信息,还可以自定义操作命令并分析执行,导出/导入两种格式(js/json)的数据文件,总之,绝大部分操作和功能需求都变得一目了然,手头富裕的同学,可以donate下,让rockmongo完善的更好、更快!
3、主要特性
• 使用宽松的New BSD License协议
• 速度快,安装简单
• 支持多语言(目前提供中文、英文、日文、巴西葡萄牙语、法语、德语、俄语、意大利语)
• 系统
可以配置多个主机,每个主机可以有多个管理员
需要管理员密码才能登入操作,确保数据库的安全性
• 服务器
服务器信息 (WEB服务器, PHP, PHP.ini相关指令 ...)
状态
数据库信息
• 数据库
查询,创建和删除
执行命令和Javascript代码
统计信息
• 集合(相当于表)
强大的查询工具
读数据,写数据,更改数据,复制数据,删除数据
查询、创建和删除索引
清空数据
批量删除和更改数据
统计信息
• GridFS
查看分块
下载文件
三、固定集合
MongoDB的固定集合(Capped Collections)是性能不错的固定大小的集合,可以将其想象为环形队列,当集合空间不够用时,再插入的元素会自动覆盖最开始插入的头部数据,确保制定大小集合中存放的是最新的数据。
1、集合创建
通过使用createCollection来新建固定集合,并且属性capped设置为true,并指定下文档的个数,具体如下:
>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
{ "ok" : 1 }
我们也可以判断集合是否为固定集合,如下:
>db.post.isCapped()
false
>db.cappedLogCollection.isCapped()
true
因为post为非固定集合,所以返回false,而后者返回true,是否可以将非固定集合转为固定集合?答案是可以,具体如下:
>db.runCommand({"convertToCapped":"post",size:10000})
{ "ok" : 1 }
以上,我们已经将集合post,转为了固定集合,大小为10000M。
2、集合查询
固定集合文档按照插入文档次序存储的,默认查询时,返回的结果顺序也是按照插入的顺序返回,我么也可以通过$nature调整返回结果顺序,具体如下所示:
>db.post.find().sort({$natural:-1}).pretty()
{
"_id" :ObjectId("57e2097e41737fc4a4eac1f1"),
"title" :"MongoDB-PHP",
"desc" : "database",
"likes" : 34500,
"url" :"kenan.mongodb.com",
"by" : "jakeup.com"
}
{
"_id" :ObjectId("57e117d7d4c6942e52befc77"),
"title" :"MongoDB-Java",
"desc" : "database",
"likes" : 300000,
"url" :"test.mongodb.com",
"by" : "cwteam.com"
}
{
"_id" :ObjectId("57e10bd076be84c977b7acda"),
"title" : "MongoDB",
"desc" : "database",
"likes" : NumberLong(100000),
"url" :"http://www.cwteam.com",
"by" : "cwteam.com"
}
3、用法特点
可以插入及更新,但更新不能超出collection的大小,否则更新失败,不允许删除,但是可以调用drop()删除集合中的所有行,但是drop后需要显式地重建集合。
另外,在32位机子上一个cappped collection的最大值约为482.5M,而64位上只受系统文件大小的限制。
优势:
• 对固定集合进行插入速度极快
• 按照插入顺序的查询输出速度极快
• 能够在插入最新数据时,淘汰最早的数据
场景:
• 用法1:储存日志信息
• 用法2:缓存一些少量的文档
• 用法3:存储一些历史记录或关键词
四、自动增长
MongoDB的文档id是非自动增长的,而是系统自动生成的12字节的唯一标志,但在某些情况下,我们是需要实现文档的id可以自动增长的,所以,既然MongoDB默认没有该功能,只能我们自行开发实现,具体如下:
1、创建js函数
我们创建一个函数getNextSequenceValue 将序列名称作为它的输入,递增序列号1,并返回更新后的序列号。在例子中,序列的名字是pid,具体如下:
>function getNextSequenceValue(sequenceName){varsequenceDoc=db.counters.findAndModify({query:{_id:sequenceName},update:{$inc:{sequence_value:1}},new:true});returnsequenceDoc.sequence_value;}
2、使用js函数
>db.products.insert({"_id":getNextSequenceValue("pid"),"pname":"AndroidTV","category":"mobile"})
>db.products.insert({"_id":getNextSequenceValue("pid"),"pname":"AppleTV","category":"mobile"})
结果显示:
>db.products.find()
{ "_id" : 1, "pname" :"Android TV", "category" : "mobile" }
{ "_id" : 2, "pname" :"Apple TV", "category" : "mobile" }
从上面结果,可以看出_id已经被我们自定义并自动增长了,步长为1哦。
好了,Mongodb高级部分(二)就介绍到这里,由于作者水平有限,如有问题请在评论发言或是QQ群276592700(新)讨论,谢谢。