(原)MongoDB在系统中的使用

序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择。

一)结构类型

  传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结构化文档,概括如下:

  结构化信息——这种信息可以在关系数据库中找到,多年来一直主导着IT应用。这是关键任务OLTP系统业务所依赖的信息,另外,还可对结构数据库信息进行排序和查询;

  半结构化信息——这是IT的第二次浪潮,包括电子邮件,文字处理文件以及大量保存和发布在网络上的信息。半结构化信息是以内容为基础,可以用于搜索,这也是谷歌存在的理由;

  非结构化信息——该信息在本质形式上可认为主要是位映射数据。数据必须处于一种可感知的形式中(诸如可在音频、视频和多媒体文件中被听或被看)。许多大数据都是非结构化的,其庞大规模和复杂性需要高级分析工具来创建或利用一种更易于人们感知和交互的结构。

二)MongoDB和行导向数据库的区别

  老实说,我觉得Nosql领域比较奇葩的东西算是Hive,不过在此不介绍它,对于项目中使用到MongoDB,也是有一定原因的,我一直以为Nosql这种东西和行导向数据库并不冲突,它仅仅是行导向数据的一个补充,对于MongoDB,它和我们用的mysql,Oracle等有什么区别,曾经我也查找过一些东西,发现网上很多相关的文章都是千篇一律,几乎一模一样,没啥价值,于是捉摸自己总结下。

  举个栗子:

uid name age
1 张三 18

  在上面的表中,很直接,数据也很直观,但是如果我们需要存储另外一个东西:头像,一般人会这样干:

uid name age photo
1 张三 18 ./upload/1.png

  尽管不同数据库都提供了直接存储二进制的数据库字段,但是我还是会选择以上的存储方式,我相信也有很多人也会这样做,这样做其实没有什么不好,但是如果我们的文件很大,几个GB,那么无论读还是写都会很耗时,成为系统的瓶颈,基于这种情况,才会诞生云计算以及Nosql这些东西,也就是说Hadoop,Hbase等诞生的原因是:

  多年来磁盘存储容量快速增加的同时,访问速度-磁盘数据读取速度却未能与时俱进,寻址时间的提高远远慢于传输速率的提高,寻址是将磁盘移动到特定磁盘位置进行读写操作,它是导致磁盘操作延迟的主要原因,而传输速率取决与磁盘的带宽。

  于是人们想出了一个办法:既然在一个服务器读取一个文件需要100个小时,那么将文件放在100个服务器,每个服务器放1%的数据,那么1小时就搞定了,这也是Hadoop的核心思想,MongoDB数据库继承了这一思想,它的区块划分,以及节点分裂,都延续了这样的思想,另一方面,MongoDB又吸取了memcached的东西,提前申请一片内存区域以及文件区域,将内存中的地址和物理地址对应起来,可以极高的提高速度,这也是MongoDB相当的消耗内存和磁盘的原因之一。

  

三)MongoDB应用范围

  1:MongoDB与传统数据库整合:

id user_id title content time
1 张三 文章标题 文章内容 时间

  在以上表中,如果内容是一个包含上千上万字的文章,一般会该字段的内容丢入MongoDB,然后在此放入MongoDB的ID。

  2:MongoDB取代传统数据库:

  在某些事物要求不高的场合,以及允许出现部分错误的系统中,可以使用MongoDB取代传统数据库,例如论坛,博客等系统,举个栗子:

  博客有人发表了一篇文章,MongoDB存储如下:

  

> db.article.insert({"title":"测试文章","content":"测试内容", "time":"17822455", "uid":"1"});
WriteResult({ "nInserted" : 1 })
> db.article.findOne();
{
        "_id" : ObjectId("546168c9573c0742d8be1544"),
        "title" : "测试文章",
        "content" : "测试内容",
        "time" : "17822455",
        "uid" : "1"
}
> 

  现在有一个人对这篇文章进行了评论,如下:

  

> var articleInfo = db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
> articleInfo;
{
        "_id" : ObjectId("54616db1d92589121def0c70"),
        "title" : "测试文章",
        "content" : "测试内容",
        "time" : "17822455",
        "uid" : "1"
}
> articleInfo.commentary={"uid":"2",info :{"content":"这篇文章不错","times":"145881444"}};
{
        "uid" : "2",
        "info" : {
                "content" : "这篇文章不错",
                "times" : "145881444"
        }
}
> db.article.update({"_id": ObjectId("54616db1d92589121def0c70")},articleInfo);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
{
        "_id" : ObjectId("54616db1d92589121def0c70"),
        "title" : "测试文章",
        "content" : "测试内容",
        "time" : "17822455",
        "uid" : "1",
        "commentary" : {
                "uid" : "2",
                "info" : {
                        "content" : "这篇文章不错",
                        "times" : "145881444"
                }
        }
}
> 

  现在又有一个人对它评论如下:

  于是MongoDB的存储结构成了这样:

  

> db.article.update({"_id":ObjectId("54617115d92589121def0c72")}, {"$push": {"commentary":{"uid":3,info :{"content":"我也这篇文章不错","times":"1444"}}}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.article.findOne({"_id":ObjectId("54617115d92589121def0c72")});
{
        "_id" : ObjectId("54617115d92589121def0c72"),
        "title" : "测试文章",
        "content" : "测试内容",
        "time" : "17822455",
        "uid" : "1",
        "commentary" : [
                {
                        "uid" : 2,
                        "info" : {
                                "content" : "这篇文章不错",
                                "times" : "1444"
                        }
                },
                {
                        "uid" : 3,
                        "info" : {
                                "content" : "我也这篇文章不错",
                                "times" : "1444"
                        }
                }
        ]
}
> 

  由此可见,如果再有评论,继续往后加就OK,MongoDB对此的存储是一目了然,伸缩性很强,如果不能够在代码中实现对数据一致性的处理,那么还是使用回关系型数据库为妙,在这种事务性不太强的场合,使用MongoDB是可以取代掉关系型数据库的。

四)MongoDB使用

  由于之前使用logback处理日志,自己还得写一大堆的shell脚本,各种awk处理文本分析用户行为丢入postgres,可能自己技术不到家,但是自己能够想出的东西也就这些,于是在这个项目中毅然决定用MongoDB作为日志分析系统。如果不在分布式中,使用Nosql没有价值,码字太辛苦了。。

  

时间: 2024-07-30 20:29:01

(原)MongoDB在系统中的使用的相关文章

【原】linux系统中,执行nosetests无法遍历以“test”开头的目录或文件的问题

最近在centos下面安装使用了nose,发现了一个问题:在命令行中执行nosetests无法遍历该目录下面以“test”开头的目录或者文件并执行文件中的测试. 1 # nosetests -v 2 3 ---------------------------------------------------------------------- 4 Ran 0 tests in 0.000s 5 6 OK 而在windows下面是可以的: 1 nosetests -v 2 here ... ok

mysqladmin在SuSE linux系统中--sleep參数使用不准确问题

我们都知道,在MySQL中.能够使用mysqladmin命令的extended-status选项来查看MySQL的执行状态,比方获取我们经常关注的几个值: # mysqladmin -uroot -proot ext |grep "Questions\|Queries\|Innodb_rows\|Com_select \|Com_insert \|Com_update \|Com_delete " | Com_delete                               |

wince系统中对nand坏块的修正

wince系统中对nand坏块的修正 产生坏块的原因是因为NANDFlash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,所以,在NAND 的生产中及使用过程中会产生坏块. 一.坏块的具体表现: 当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到 Status Register的相应位. 二.坏块的种类: 1.先天性坏块 这种坏块是在生产过程中产生的,一般芯片原厂都会在出厂时都会将坏块第一个p

DVB-C系统中QAM调制与解调仿真

本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对"信道"这方面的知识进行实践的机会一直不是很多,做这个小程序的过程中也熟悉了不少相关的知识.在这个程序中,每执行一步操作,都会画出时域信号图和频域信号图,同时会在控制台打印出有关变量的取值,对于理解QAM调制与解调有一定的帮助. 一.DVB-C中QAM的调制与解调 简单介绍DVB-C系统中的Q

eclipse 添加 Courier New 字体,系统中是有这个字体但是Eclipse看不到

想要在 Eclipse中添加 Courier New 字体,但是没有在 eclipse->windows->preferences->general->apperance->colors and fonts->basic->text fonts 中找到这个字体,但是这个字体我以前在系统字体中看到过,怎么会没有 .于是乎[下面是我已经设置好的],     原先是“显示” 点击一下,让这个字体可见 ,重启Eclipse 然后就可以在字体中找到了 eclipse 添加

mysqladmin在SuSE linux系统中--sleep参数使用不准确问题

我们都知道,在MySQL中,可以使用mysqladmin命令的extended-status选项来查看MySQL的运行状态,比如获取我们常常关注的几个值: # mysqladmin -uroot -proot ext |grep "Questions\|Queries\|Innodb_rows\|Com_select \|Com_insert \|Com_update \|Com_delete " | Com_delete                               |

实例讲解Linux系统中硬链接与软链接的创建

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

嵌入式系统中为什么要添加操作系统?(转)

原帖地址:http://blog.sina.com.cn/s/blog_8f396e370100vjs0.html 嵌入式系统中为什么要添加操作系统?这个问题很多人都能回答,并且也一定要很多答案.当外行问及我这个问题的时候,我说是想让程序脱离硬件,提高程序的可移植性和可读性:另外就是当系统比较复杂的情况下,操作系统可以为这个复杂的系统提供管理机制,开发人员只要完成功能函数,并且添加任务即可,不用再去管不同的任务之间通信以及各个不同功能之间如何协同工作等等的问题.但是这样说出来,似乎没法让他们感受

LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法

LoadRunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,数据始终不能写入数据库.查了一下原因,应该是录制的脚本不完善的问题,因为JS是在客户端执行的程序,LR只能监控客户机与服务器之前的通信. 解决方法: Recording options> HTTP Properites> Advanced > Headers: 选择"Record headers not in list", 然后点ok. 重新录制一遍脚本,会发现脚本里多出一