MongoDB高级部分及实现(二)

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(新)讨论,谢谢。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值