<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>浮山狼de博客 &#187; Nosql</title>
	<atom:link href="https://www.fushanlang.com/tag/nosql/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fushanlang.com</link>
	<description>next station - 下一站，活在当下，且行且思</description>
	<lastBuildDate>Sat, 29 Nov 2014 15:14:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.5</generator>
	<item>
		<title>Mongodb 1.6与Mongodb 1.4并发性能对比</title>
		<link>https://www.fushanlang.com/mongodb-1-6-compared-with-concurrent-performance-mongodb-1-4-1267/</link>
		<comments>https://www.fushanlang.com/mongodb-1-6-compared-with-concurrent-performance-mongodb-1-4-1267/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 00:49:36 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Nosql]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=1267</guid>
		<description><![CDATA[<p>2010年8月5日，Mongodb 1.6正式发布了，这个版本增加和改进了很多功能，我了解的几个比较大的改进在：</p> <p> 1) Mongodb存储文件申请磁盘空间的方式做了改进。在mongodb  1.4的时候是按128M,256M,512M,1024M,2048M这样的方式申请磁盘空间的；而在mongodb  1.6中，已经是动态小量的申请磁盘空间了。</p> <p> 2) 增加了$or等查询操作符，这在mongodb 1.4的时候是没有的。</p> <p> 3) 改进和提高了并发性能。 </p> <p>4) Replication的同步方面做了改进。</p> <p> 5) etc&#8230; 详细的changelog可以看：http://jira.mongodb.org/browse/SERVER?report=com.atlassian.jira.plugin.system.project:changelog-panel</p> <p>在我发表这篇文章时，发现Mongodb 1.6.1也已经发布了，主要是修复了一些bug。居然说性能得到了提高，那么我们就对Mongodb 1.6和Mongodb 1.4分别做了一个性能测试，想对比下看看Mongodb 1.6性能到底比Mongodb 1.4提高了多少。测试机器为一台普通台式机，安装在64位centos linux 5.4系统。cpu为Intel E7500，内存为2G,单个普通500G硬盘。</p> <p> 测试程序每次测试都会insert 100万条记录（如10并发测试，每并发insert 10万条记录；20并发测试，每并发5万条记录&#8230;），每记录大小为1KB，然后再逐条update所有记录，最后逐条select出来。测试程序是在本机跑的，所以本次测试忽略网络延时。好，下面我们看测试结果：下面图中横轴10&#8230;100是指并发测试的并发线程。</p> <p style="text-align: center;"></p> <p>在insert测试内，Mongodb1.4和Mongodb1.6平分秋色，基本上没有区别。虽然在mongodb 1.6中对申请磁盘空间方式做了改进，但对性能的提升没有体现出来。随着并发的增加，性能快速下降的问题也没有得到改进。</p> <p style="text-align: center;"></p> <p>在update方面，性能提升显著，合计有75%的性能提高。而且表现平稳，随着并发的增加，性能稳定。非常不错。</p> <p style="text-align: center;"></p> <p>select方面表现也不错，合计有83%性能提高。在并发线程小时尤其明显。 通过上面几个方面测试的结果表明，Mongodb <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/mongodb-1-6-compared-with-concurrent-performance-mongodb-1-4-1267/">Mongodb 1.6与Mongodb 1.4并发性能对比</a></span>]]></description>
				<content:encoded><![CDATA[<p>2010年8月5日，<span class="highlight">Mongodb</span> 1.6正式发布了，这个版本增加和改进了很多功能，我了解的几个比较大的改进在：</p>
<p> 1) <span class="highlight">Mongodb</span>存储文件申请磁盘<span class="highlight">空间</span>的方式做了改进。在<span class="highlight">mongodb</span>  1.4的时候是按128M,256M,512M,1024M,2048M这样的方式申请磁盘<span class="highlight">空间</span>的；而在<span class="highlight">mongodb</span>  1.6中，已经是动态小量的申请磁盘<span class="highlight">空间</span>了。</p>
<p> 2) 增加了$or等查询操作符，这在<span class="highlight">mongodb</span> 1.4的时候是没有的。</p>
<p> 3) 改进和提高了并发性能。 <span id="more-1267"></span></p>
<p>4) Replication的同步方面做了改进。</p>
<p> 5) etc&#8230; 详细的changelog可以看：http://jira.<span class="highlight">mongodb</span>.org/browse/SERVER?report=com.atlassian.jira.plugin.system.project:changelog-panel</p>
<p>在我发表这篇文章时，发现<span class="highlight">Mongodb</span> 1.6.1也已经发布了，主要是修复了一些bug。居然说性能得到了提高，那么我们就对<span class="highlight">Mongodb</span> 1.6和<span class="highlight">Mongodb</span> 1.4分别做了一个性能测试，想对比下看看<span class="highlight">Mongodb</span> 1.6性能到底比<span class="highlight">Mongodb</span> 1.4提高了多少。测试机器为一台普通台式机，安装在64位centos linux 5.4系统。cpu为Intel E7500，内存为2G,单个普通500G硬盘。</p>
<p> 测试程序每次测试都会insert 100万条记录（如10并发测试，每并发insert 10万条记录；20并发测试，每并发5万条记录&#8230;），每记录大小为1KB，然后再逐条update所有记录，最后逐条select出来。测试程序是在本机跑的，所以本次测试忽略网络延时。好，下面我们看测试结果：下面图中横轴10&#8230;100是指并发测试的并发线程。</p>
<p style="text-align: center;"><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/10/084938rTn.jpg" alt="Mongodb 1.6与Mongodb 1.4的并发性能对比" /></p>
<p>在insert测试内，<span class="highlight">Mongodb</span>1.4和<span class="highlight">Mongodb</span>1.6平分秋色，基本上没有区别。虽然在<span class="highlight">mongodb</span> 1.6中对申请磁盘<span class="highlight">空间</span>方式做了改进，但对性能的提升没有体现出来。随着并发的增加，性能快速下降的问题也没有得到改进。</p>
<p style="text-align: center;"><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/10/084940xhX.jpg" alt="Mongodb 1.6与Mongodb 1.4的并发性能对比" /></p>
<p>在update方面，性能提升显著，合计有75%的性能提高。而且表现平稳，随着并发的增加，性能稳定。非常不错。</p>
<p style="text-align: center;"><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/10/084941xNh.jpg" alt="Mongodb 1.6与Mongodb 1.4的并发性能对比" /></p>
<p>select方面表现也不错，合计有83%性能提高。在并发线程小时尤其明显。<br />
通过上面几个方面测试的结果表明，<span class="highlight">Mongodb</span> 1.6是还是非常值得我们升级的，不但增加了一些新功能，性能也得到了很大的提高。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/mongodb-1-6-compared-with-concurrent-performance-mongodb-1-4-1267/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Install mongodb on bluehost</title>
		<link>https://www.fushanlang.com/install-the-mongodb-on-bluehost-413/</link>
		<comments>https://www.fushanlang.com/install-the-mongodb-on-bluehost-413/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 03:50:34 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Nosql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=413</guid>
		<description><![CDATA[<p>Oh,最近想在bluehost主机上安装MongoDB，于是google了一下，看到一篇博文（大意）：</p> <p>I want to install MongoDB on bluehost  recently. so I first  get some message from internet.</p> <p>logging in, I typed:</p> <p>uname -a</p> <p>And received affirmation that this is a 64bit server. Or you can typed:</p> <p>getconf   LONG_BIT</p> <p>It will return 64.</p> <p>Next, I went ahead and grabbed the current version from http://www.mongodb.org/downloads <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/install-the-mongodb-on-bluehost-413/">Install mongodb on bluehost</a></span>]]></description>
				<content:encoded><![CDATA[<p>Oh,最近想在bluehost主机上安装MongoDB，于是google了一下，看到一篇博文（大意）：</p>
<p>I want to install MongoDB on bluehost  recently. so I first  get some message from internet.</p>
<p>logging in, I typed:</p>
<p><code>uname -a</code></p>
<p>And received affirmation that this is a 64bit server. Or you can typed:</p>
<p>getconf   LONG_BIT</p>
<p>It will return 64.</p>
<p>Next, I went ahead and grabbed the current version from <a href="http://www.mongodb.org/downloads">http://www.mongodb.org/downloads</a> by doing:</p>
<p><code>wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-static-legacy-1.6.1.tgz<br />
tar xzf mongodb-linux-x86_64-static-legacy-1.6.1.tgz <span id="more-413"></span><br />
</code></p>
<p>Change as necessary for the current version.  Then I ran the tests on the <a href="http://www.mongodb.org/display/DOCS/Quickstart+Unix#QuickstartUnix-Runandconnecttotheserver" target="_blank">quickstart page</a> of mongodb.org.  After I received confirmation that I successfully installed mongo, I headed over to their page about PHP driver…to quickly find out that installing <span style="color: #ff6600;">using </span><code><span style="color: #ff6600;">pecl</span></code><span style="color: #ff6600;"> does not work so well on bluehost</span>. The default extension_dir is set to read only.</p>
<p>So, I headed over to <a href="http://php.net/manual/en/mongo.installation.php" target="_blank">php.net’s mongo driver installation page</a>, and quickly looked at the manual installation instructions.  Following directions there was pretty easy and didn’t cause any problems until I go to the part about enabling the extension.  So, off to the php.ini file.  My favorite file of them all.</p>
<p>So, I do a quick search for the extension directory and take that information, and do a:</p>
<p><code>cp -r /usr/lib64/php/modules ~/php/modules</code></p>
<p>That copies all the modules in the default modules directory into a directory that I have some control over.  I then copied mongo.so from the installation directory into my new modules directory, and tada! everything is then working.</p>
<p>一开始，我就参照着弄了，但是phpinfo就是识别不了，今天终于想起来原来是extend_dir=~/php/modules 在php.ini里不识别应该改为完整的路径</p>
<p>extend_dir=&#8221;/home2/username/php/modules&#8221;</p>
<p>就Okay 了，真是一波三折，我还以为bluehost 不支持MongoDB，看来小看我可爱的BlueHost了。:)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>This article is a little more up to date with the changes made by Hostmonster / Bluehost, and to make the instructions a little more clear, and simplified.</p>
<p>1. Download the MongoDB binaries – You want to download the  <strong>legacy-static</strong>  production release. Hosmonster / Bluehost run Linux 64-bit</p>
<p><a href="http://www.mongodb.org/downloads">Download</a></p>
<p>I found it easier to extract the files on my desktop then upload them to a directory called mongodb in the root home folder.</p>
<p>Your MongoDB folder should look like the below when all done:<br />
<strong>/home/{username}/mongodb</strong><br />
<strong>/home/{username}/mongodb/bin</strong><br />
<strong>/home/{username}/mongodb/data</strong><br />
<strong>/home/{username}/mongodb/include</strong><br />
<strong>/home/{username}/mongodb/lib64</strong></p>
<p>Replace {username} with your login name for Hostmonster / Bluehost. You can find your username in the cPanel on the left where it says username.</p>
<p>2. In your SSH/Shell console – Now we need to make the MongoDB command usable so do the following commands</p>
<p><strong>nano .bashrc</strong></p>
<p>3. Now add the following line to the bottom of the file.</p>
<p><strong>export PATH=/home/{username}/mongodb/bin:$PATH</strong></p>
<p>Replace {username} with your login name for Hostmonster / Bluehost. You can find your username in the cPanel on the left where it says username.</p>
<p>4. Save</p>
<p><strong>ctrl+x</strong>  confirm save by typing ‘Y’ then enter, then enter again to confirm the file.</p>
<p>5. Lets verify that everything is working. You will need to reload bash</p>
<p><strong>source .bashrc</strong></p>
<p>6. Make the MongoDB binaries executable</p>
<p><strong>chmod 744 -R mongodb/bin</strong></p>
<p>7. Verify MongoDB is running</p>
<p><strong>mongod —version</strong></p>
<p>8. Start the MongoDB</p>
<p><strong>screen mongod —dbpath /home/{username}/mongodb/data —quiet</strong></p>
<p>Now safe to exit your Shell Console</p>
<p>Replace {username} with your login name for Hostmonster / Bluehost. You can find your username in the cPanel on the left where it says username.</p>
<blockquote><p><strong>They only let you run a program for 5 minutes before killing it, so it’s fairly useless to install MongoDB unless you have a dedicated IP.</strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/install-the-mongodb-on-bluehost-413/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为何使用非关系数据库</title>
		<link>https://www.fushanlang.com/why-use-nosql-312/</link>
		<comments>https://www.fushanlang.com/why-use-nosql-312/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 08:54:01 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[Nosql]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=312</guid>
		<description><![CDATA[<p></p> <p>随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付 web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：</p> <p>1、High performance &#8211; 对数据库高并发读写的需求 web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的 BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。</p> <p>2、Huge Storage &#8211; 对海量数据的高效率存储和访问的需求 类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。 </p> <p>3、High Scalability &#38;&#38; High Availability- 对数据库的高可扩展性和高可用性的需求 在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？</p> <p>在上面提到的“三高”需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：</p> <p>1、数据库事务一致性需求 很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。</p> <p>2、数据库的写实时性和读实时性需求 对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。</p> <p>3、对复杂的SQL查询，特别是多表关联查询的需求 任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。</p> <p>因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value Store DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了NoSQL Conference，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：</p> <p>Redis，Tokyo Cabinet，Cassandra，Voldemort，MongoDB，Dynomite，HBase，CouchDB，Hypertable， Riak，Tin， Flare， Lightcloud， KiokuDB，Scalaris， Kai， ThruDB，  &#8230;&#8230;</p> <p>这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，我(robbin)也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：</p> <p>一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo Cabinet， Flare</p> <p>高性能Key-Value数据库的主要特点就是具有极高的并发读写性能，Redis，Tokyo Cabinet， Flare，这3个Key-Value DB都是用C编写的，他们的性能都相当出色，但出了出色的性能，他们还有自己独特的功能：</p> <p>1、Redis Redis是一个很新的项目，刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，每秒可以处理超过10万次读写操作，是我知道的性能最快的Key-Value <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/why-use-nosql-312/">为何使用非关系数据库</a></span>]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/08/011705WfO.gif" alt="" /></p>
<p>随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付 web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：</p>
<p>1、High performance &#8211; 对数据库高并发读写的需求<br />
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的 BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。</p>
<p>2、Huge Storage &#8211; 对海量数据的高效率存储和访问的需求<br />
类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。 <span id="more-312"></span></p>
<p>3、High Scalability &amp;&amp; High Availability- 对数据库的高可扩展性和高可用性的需求<br />
在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？</p>
<p>在上面提到的“三高”需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：</p>
<p>1、数据库事务一致性需求<br />
很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。</p>
<p>2、数据库的写实时性和读实时性需求<br />
对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。</p>
<p>3、对复杂的SQL查询，特别是多表关联查询的需求<br />
任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。</p>
<p>因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value Store DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了NoSQL Conference，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：</p>
<p>Redis，Tokyo Cabinet，Cassandra，Voldemort，MongoDB，Dynomite，HBase，CouchDB，Hypertable， Riak，Tin， Flare， Lightcloud， KiokuDB，Scalaris， Kai， ThruDB，  &#8230;&#8230;</p>
<p>这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，我(robbin)也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：</p>
<p>一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo Cabinet， Flare</p>
<p>高性能Key-Value数据库的主要特点就是具有极高的并发读写性能，Redis，Tokyo Cabinet， Flare，这3个Key-Value DB都是用C编写的，他们的性能都相当出色，但出了出色的性能，他们还有自己独特的功能：</p>
<p>1、Redis<br />
Redis是一个很新的项目，刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，每秒可以处理超过10万次读写操作，是我知道的性能最快的Key-Value DB。</p>
<p>Redis的出色之处不仅仅是性能，Redis最大的魅力是支持保存List链表和Set集合的数据结构，而且还支持对List进行各种操作，例如从List两端push和pop数据，取List区间，排序等等，对Set支持各种集合的并集交集操作，此外单个value的最大限制是1GB，不像 memcached只能保存1MB的数据，因此Redis可以用来实现很多有用的功能，比方说用他的List来做FIFO双向链表，实现一个轻量级的高性能消息队列服务，用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间，因此也可以被当作一个功能加强版的memcached来用。</p>
<p>Redis的主要缺点是数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，并且它没有原生的可扩展机制，不具有scale（可扩展）能力，要依赖客户端来实现分布式读写，因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有 github，Engine Yard。</p>
<p>2、Tokyo Cabinet和Tokoy Tyrant<br />
TC和TT的开发者是日本人Mikio Hirabayashi，主要被用在日本最大的SNS网站mixi.jp上，TC发展的时间最早，现在已经是一个非常成熟的项目，也是Kye-Value 数据库领域最大的热点，现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎，而TT提供了多线程高并发服务器，性能也非常出色，每秒可以处理 4-5万次读写操作。</p>
<p>TC除了支持Key-Value存储之外，还支持保存Hashtable数据类型，因此很像一个简单的数据库表，并且还支持基于column的条件查询，分页查询和排序功能，基本上相当于支持单表的基础查询功能了，所以可以简单的替代关系数据库的很多操作，这也是TC受到大家欢迎的主要原因之一，有一个Ruby的项目miyazakiresistance将TT的hashtable的操作封装成和ActiveRecord一样的操作，用起来非常爽。</p>
<p>TC/TT在mixi的实际应用当中，存储了2000万条以上的数据，同时支撑了上万个并发连接，是一个久经考验的项目。TC在保证了极高的并发读写性能的同时，具有可靠的数据持久化机制，同时还支持类似关系数据库表结构的hashtable以及简单的条件，分页和排序操作，是一个很棒的NoSQL数据库。</p>
<p>TC的主要缺点是在数据量达到上亿级别以后，并发写数据性能会大幅度下降，NoSQL: If Only It Was That Easy提到，他们发现在TC里面插入1.6亿条2-20KB数据的时候，写入性能开始急剧下降。看来是当数据量上亿条的时候，TC性能开始大幅度下降，从TC作者自己提供的mixi数据来看，至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。</p>
<p>这个是Tim Yang做的一个Memcached，Redis和Tokyo Tyrant的简单的性能评测，仅供参考</p>
<p>3、Flare<br />
TC是日本第一大SNS网站mixi开发的，而Flare是日本第二大SNS网站green.jp开发的，有意思吧。Flare简单的说就是给 TC添加了scale功能。他替换掉了TT部分，自己另外给TC写了网络服务器，Flare的主要特点就是支持scale能力，他在网络服务端之前添加了一个node server，来管理后端的多个服务器节点，因此可以动态添加数据库服务节点，删除服务器节点，也支持failover。如果你的使用场景必须要让TC可以scale，那么可以考虑flare。</p>
<p>flare唯一的缺点就是他只支持memcached协议，因此当你使用flare的时候，就不能使用TC的table数据结构了，只能使用TC 的key-value数据结构存储。</p>
<p>二、满足海量存储需求和访问的面向文档的数据库：MongoDB，CouchDB</p>
<p>面向文档的非关系数据库主要解决的问题不是高性能的并发读写，而是保证海量数据存储的同时，具有良好的查询性能。MongoDB是用C++开发的，而CouchDB则是Erlang开发的：</p>
<p>1、MongoDB<br />
MongoDB是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。他支持的数据结构非常松散，是类似json的bjson格式，因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。</p>
<p>Mongo主要解决的是海量数据的访问效率问题，根据官方的文档，当数据量达到50GB以上的时候，Mongo的数据库访问速度是MySQL的 10倍以上。Mongo的并发读写效率不是特别出色，根据官方提供的性能测试表明，大约每秒可以处理0.5万－1.5次读写请求。对于Mongo的并发读写性能，我（robbin）也打算有空的时候好好测试一下。</p>
<p>因为Mongo主要是支持海量数据存储的，所以Mongo还自带了一个出色的分布式文件系统GridFS，可以支持海量的数据存储，但我也看到有些评论认为GridFS性能不佳，这一点还是有待亲自做点测试来验证了。</p>
<p>最后由于Mongo可以支持复杂的数据结构，而且带有强大的数据查询功能，因此非常受到欢迎，很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用，比方说why we migrated from MySQL to MongoDB就是一个真实的从MySQL迁移到MongoDB的案例，由于数据量实在太大，所以迁移到了Mongo上面，数据查询的速度得到了非常显著的提升。</p>
<p>MongoDB也有一个ruby的项目MongoMapper，是模仿Merb的DataMapper编写的MongoDB的接口，使用起来非常简单，几乎和DataMapper一模一样，功能非常强大易用。</p>
<p>2、CouchDB<br />
CouchDB现在是一个非常有名气的项目，似乎不用多介绍了。但是我却对CouchDB没有什么兴趣，主要是因为CouchDB仅仅提供了基于 HTTP REST的接口，因此CouchDB单纯从并发读写性能来说，是非常糟糕的，这让我立刻抛弃了对CouchDB的兴趣。</p>
<p>三、满足高可扩展性和可用性的面向分布式计算的数据库：Cassandra，Voldemort</p>
<p>面向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样，它首先必须是一个分布式的数据库系统，由分布在不同节点上面的数据库共同构成一个数据库服务系统，并且根据这种分布式架构来提供online的，具有弹性的可扩展能力，例如可以不停机的添加更多数据节点，删除数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java开发的：</p>
<p>1、Cassandra<br />
Cassandra项目是Facebook在2008年开源出来的，随后Facebook自己使用Cassandra的另外一个不开源的分支，而开源出来的Cassandra主要被Amazon的Dynamite团队来维护，并且Cassandra被认为是Dynamite2.0版本。目前除了 Facebook之外，twitter和digg.com都在使用Cassandra。</p>
<p>Cassandra的主要特点就是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其他节点上去，对Cassandra的读操作，也会被路由到某个节点上面去读取。对于一个Cassandra群集来说，扩展性能是比较简单的事情，只管在群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。</p>
<p>Cassandra也支持比较丰富的数据结构和功能强大的查询语言，和MongoDB比较类似，查询功能比MongoDB稍弱一些，twitter的平台架构部门领导Evan Weaver写了一篇文章介绍Cassandra：http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/，有非常详细的介绍。</p>
<p>Cassandra以单个节点来衡量，其节点的并发读写性能不是特别好，有文章说评测下来Cassandra每秒大约不到1万次读写请求，我也看到一些对这个问题进行质疑的评论，但是评价Cassandra单个节点的性能是没有意义的，真实的分布式数据库访问系统必然是n多个节点构成的系统，其并发性能取决于整个系统的节点数量，路由效率，而不仅仅是单节点的并发负载能力。</p>
<p>2、Voldemort<br />
Voldemort是个和Cassandra类似的面向解决scale问题的分布式数据库系统，Cassandra来自于Facebook这个 SNS网站，而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库，例如Cassandar，Voldemort，Tokyo Cabinet，Flare等等。Voldemort的资料不是很多，因此我没有特别仔细去钻研，Voldemort官方给出Voldemort的并发读写性能也很不错，每秒超过了1.5万次读写。</p>
<p>从Facebook开发Cassandra，Linkedin开发Voldemort，我们也可以大致看出国外大型SNS网站对于分布式数据库，特别是对数据库的scale能力方面的需求是多么殷切。前面我（robbin）提到，web应用的架构当中，web层和app层相对来说都很容易横向扩展，唯有数据库是单点的，极难scale，现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向，这也是为什么现在 Cassandra这么热门的主要原因。</p>
<p>如今，NoSQL数据库是个令人很兴奋的领域，总是不断有新的技术新的产品冒出来，改变我们已经形成的固有的技术观念，我自己（robbin）稍微了解了一些，就感觉自己深深的沉迷进去了，可以说NoSQL数据库领域也是博大精深的，我（robbin）也只能浅尝辄止，我（robbin）写这篇文章既是自己一点点钻研心得，也是抛砖引玉，希望吸引对这个领域有经验的朋友来讨论和交流。</p>
<p>从我（robbin）个人的兴趣来说，分布式数据库系统不是我能实际用到的技术，因此不打算花时间深入，而其他两个数据领域（高性能 NoSQLDB和海量存储NoSQLDB）都是我很感兴趣的，特别是Redis，TT/TC和MongoDB这3个NoSQL数据库，因此我接下来将写三篇文章分别详细介绍这3个数据库。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/why-use-nosql-312/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>windows MongoDB安装</title>
		<link>https://www.fushanlang.com/install-windows-mongodb-302/</link>
		<comments>https://www.fushanlang.com/install-windows-mongodb-302/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 07:12:40 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Nosql]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=302</guid>
		<description><![CDATA[<p>下载安装程序</p> <p>到http://www.mongodb.org/的下载页找到windows 32位的安装程序，实际是一个绿色的程序。本文以mongodb-win32-i386-1.6.0.zip 为例。</p> <p>配置运行MongoDB</p> <p>将下载下来的mongodb压缩包解压缩到目标目录，比如D:\mongodb ,先打开cmd命令行，输入：</p> <p>d:\mongodb\bin&#62;mongod.exe &#8211;dbpath d:\mongodb\db</p> <p>这里的d:\mongodb 目录下没有db文件夹需要自己建立一个，此时mongod 进程运行起来，再打开一个cmd窗口，输入：</p> <p>d:\mongodb\bin\mongo.exe</p> <p>进入mongodb命令模式</p> <p>MongoDB Shell Version:1.6.0 connection to  (databaseName) &#62;show dbs admin local</p> <p>可以预先看一下数据库状况，默认会有admin,local 两个数据库。</p> <p>&#62;use testdb   ;打开数据库，没有的话立即建一个 &#62; db.myc.save({a:10})  ;向 collection mpc 中保存一条信息，没有collection的话立即建一个</p> <p>&#62; db.myc.find()  ;检索所有记录 { &#8220;_id&#8221; : ObjectId(&#8220;4c469967dd6f000000001637&#8243;), &#8220;a&#8221; : 10 }</p> <p>&#62; show collections  ;显示所有 collection 名字 myc <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/install-windows-mongodb-302/">windows MongoDB安装</a></span>]]></description>
				<content:encoded><![CDATA[<p><strong>下载安装程序</strong></p>
<p>到<a class="wp-caption" href="http://www.mongodb.org" target="_blank">http://www.mongodb.org/</a>的下载页找到windows 32位的安装程序，实际是一个绿色的程序。本文以mongodb-win32-i386-1.6.0.zip 为例。</p>
<p><strong>配置运行MongoDB</strong></p>
<p>将下载下来的mongodb压缩包解压缩到目标目录，比如D:\mongodb ,先打开cmd命令行，输入：</p>
<p>d:\mongodb\bin&gt;mongod.exe &#8211;dbpath  d:\mongodb\db</p>
<p>这里的d:\mongodb 目录下没有db文件夹需要自己建立一个，此时mongod 进程运行起来，再打开一个cmd窗口，输入：</p>
<p>d:\mongodb\bin\mongo.exe</p>
<p>进入mongodb命令模式<span id="more-302"></span></p>
<p><span style="color: #008000;">MongoDB Shell Version:1.6.0<br />
connection to  (databaseName)<br />
&gt;show dbs<br />
admin<br />
local</span></p>
<p>可以预先看一下数据库状况，默认会有admin,local 两个数据库。</p>
<p><span style="color: #008000;">&gt;use testdb   ;打开数据库，没有的话立即建一个<br />
&gt; db.myc.save({a:10})  ;向 collection  mpc 中保存一条信息，没有collection的话立即建一个</span></p>
<p><span style="color: #008000;">&gt; db.myc.find()  ;检索所有记录<br />
{ &#8220;_id&#8221; :  ObjectId(&#8220;4c469967dd6f000000001637&#8243;), &#8220;a&#8221; : 10 }</span></p>
<p><span style="color: #008000;">&gt; show collections  ;显示所有 collection 名字<br />
myc<br />
system.indexes  ;系统使用</span></p>
<p>help 是帮助命令，随时可以运行以查看命令提示。</p>
<p><strong>配置MongDB服务</strong></p>
<p>为了避免每次打开cmd窗口启动MongoDB，可以注册为服务，cmd命令为:</p>
<p>d:\mongodb\bin\mongod.exe -dbpath  d:\mongodb\db  -logpath d:\mongodb\log  -install</p>
<p>此命令虽然可以注册上windows service 服务，但是我却遇到了无法启动的问题，提示：“错误1053 ，服务没有及时响应启动或控制请求”。郁闷之余想到了以VBS文件调用bat批处理来实现隐藏cmd命令后台运行。</p>
<p>首先建立bat文件：<br />
mongo-start.bat 内容d:\mongodb\bin\mongod.exe -dbpath=d:\mongodb\db -logpath=d:\mongodb\log<br />
mongo-stop.bat 内容 taskkill /f /t /im mongod.exe</p>
<p>然后建立vbs文件:<br />
mongo-start.vbs:<br />
Set ws = CreateObject(&#8220;Wscript.Shell&#8221;)<br />
ws.run &#8220;cmd /c d:\mongodb\mongo-start.bat&#8221;,vbhide</p>
<p>mongo-stop.vbs:<br />
Set ws = CreateObject(&#8220;Wscript.Shell&#8221;)<br />
ws.run &#8220;cmd /c d:\mongodb\mongo-stop.bat&#8221;,vbhide</p>
<p>这样启动、停止MongoDB可以调用vbs文件，后台运行了。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/install-windows-mongodb-302/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP操作MongoDB</title>
		<link>https://www.fushanlang.com/php-operation-mongodb-276/</link>
		<comments>https://www.fushanlang.com/php-operation-mongodb-276/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 05:55:54 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Nosql]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=276</guid>
		<description><![CDATA[<p>本教程[翻译自PHP官方手册]</p> <p>MongoDB是最近比较流行的NoSQL数据库，网络上关于PHP操作MongoDB的资料太少了，大部分都是英文文档，于是蜗牛我用蹩脚的英语为大家翻译一下来自PHP官方的文档，水平有限请多多见谅</p> <p>链接数据库 使用下面的代码创建一个数据库链接</p> &#60;?php $connection = new Mongo(); //链接到 localhost:27017 $connection = new Mongo( "example.com" ); //链接到远程主机(默认端口) $connection = new Mongo( "example.com:65432" ); //链接到远程主机的自定义的端口 ?&#62; <p>现在你可以使用$connection链接来操作数据库了</p> <p>选择数据库 使用下面的代码来选择一个数据库</p> &#60;?php $db = $connection-&#62;dbname; ?&#62; <p>这里的数据库并不一定是一个已经存在的数据库，如果所选择的数据库不存在，则会新建一个数据库，所以在选择数据库的时候，注意一定要填上正确的数据库名 如果拼写错误的话，很有可能会新建一个数据库</p> &#60;?php $db = $connection-&#62;mybiglongdbname; //做一些事情 $db = $connection-&#62;mybiglongdbnme; //现在会连上一个新的数据库 ?&#62; <p>获取一个集合 获取一个集合跟选择数据库拥有相同的语法格式</p> &#60;?php $db = $connection-&#62;baz;//选择数据库 $collection = <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/php-operation-mongodb-276/">PHP操作MongoDB</a></span>]]></description>
				<content:encoded><![CDATA[<p><strong>本教程[翻译自PHP官方手册]</strong></p>
<p>MongoDB是最近比较流行的NoSQL数据库，网络上关于PHP操作MongoDB的资料太少了，大部分都是英文文档，于是蜗牛我用蹩脚的英语为大家翻译一下来自PHP官方的文档，水平有限请多多见谅</p>
<p><strong>链接数据库</strong><br />
使用下面的代码创建一个数据库链接</p>
<pre name="code" class="php">
&lt;?php
$connection = new Mongo(); //链接到 localhost:27017
$connection = new Mongo( "example.com" ); //链接到远程主机(默认端口)
$connection = new Mongo( "example.com:65432" ); //链接到远程主机的自定义的端口
?&gt;
</pre>
<p>现在你可以使用$connection链接来操作数据库了</p>
<p><strong>选择数据库</strong><br />
使用下面的代码来选择一个数据库</p>
<pre name="code" class="php">
&lt;?php
$db = $connection-&gt;dbname;
?&gt;</pre>
<p>这里的数据库并不一定是一个已经存在的数据库，如果所选择的数据库不存在，则会新建一个数据库，所以在选择数据库的时候，注意一定要填上正确的数据库名<br />
如果拼写错误的话，很有可能会新建一个数据库</p>
<pre name="code" class="php">
&lt;?php
$db = $connection-&gt;mybiglongdbname;
//做一些事情
$db = $connection-&gt;mybiglongdbnme;
//现在会连上一个新的数据库
?&gt;
</pre>
<p><strong>获取一个集合</strong><br />
获取一个集合跟选择数据库拥有相同的语法格式</p>
<pre name="code" class="php">&lt;?php
$db = $connection-&gt;baz;//选择数据库
$collection = $db-&gt;foobar;//选择foobar集合
//或者使用更简洁的方式
$collection = $connection-&gt;baz-&gt;foobar;
?&gt;
</pre>
<p><strong>插入一个文档</strong><br />
多维数组是可以被储存到数据库中的基本单元<br />
一个随机的文档可能是这样</p>
<pre name="code" class="php">
&lt;?php

$doc = array(
"name" => "MongoDB",
"type" => "database",
"count" => 1,
"info" => (object)array( "x" => 203,
"y" => 102),
"versions" => array("0.9.7″, "0.9.8″, "0.9.9″)
);
?&gt;
</pre>
<p>注意：你可以嵌套数组与对象，对象与文档在mongodb中几乎是一样的，你可以使用$doc调用一个文档或对象，但是info字段总是一个对象而不是一个文档，<br />
本约束适用于所有文档</p>
<p>使用MongoCollection::insert()插入一个文档</p>
<pre name="code" class="php">
&lt;?php
$m = new Mongo();
$collection = $m-&gt;foo-&gt;bar;
$collection-&gt;insert($doc);
?&gt;
</pre>
<p>使用MongoCollection::findOne()查询文档<br />
为了证明上面那段代码的数据已经插入到数据库里了，我们进行简单的 findOne()操作以得到集合中的第一个文档数据，这种方法只返回一个文档数据，<br />
这种方法适用于在你的查询语句的时候只匹配一个文档或者你只关心第一条数据</p>
<pre name="code" class="php">
&lt;?php
$obj = $collection-&gt;findOne();
var_dump( $obj );
?&gt;
</pre>
<p>你会看到下列结果</p>
<pre name="code" class="php">
array(5) {
["_id"]=>
object(MongoId)#6 (0) {
}
["name"]
string(7) "MongoDB"
["type"]=>
string(8) "database"
["count"]=>
int(1)
["info"]=>
array (2) {
["x"]=>
int(203)
["y"]=>
int(102)
}
["versions"]
array(3) {
[0]=>
string(5) "0.9.7″
[1]=>
string(5) "0.9.8″
[2]=>
string(5) "0.9.9″
}
}
</pre>
<p>注意_id字段自动加载了文档上，MongoDB储存元素中以_以及$开头的都是供内部使用的</p>
<p><strong>添加更多文档</strong><br />
为了做一些更有趣的事情，我们添加更多简单的文档到集合中，这些文档如下</p>
<pre name="code" class="php">
&lt;?php
array( "i" => value );
?&gt;
</pre>
<p>我们可以使用循环相当有效的插入数据</p>
<pre name="code" class="php">
&lt;?php
for($i=0; $i<100; $i++) {
$collection-&gt;nsert( array( "i" => $i ) );
}
?&gt;</pre>
<p>注意：我们可以插入不同的字段在同一字符集中，在这方面意味着MongoDB拥有非常自由的储存模式</p>
<p>在一个集合中计算文档的数量<br />
现在我们插入了101个文档(我们用循环插入了100个，之前还插入了一个)，我们可以使用count()来看看我们的数据是不是都被插入进去了</p>
<pre name="code" class="php">
&lt;?php
echo $collection-&gt;count();
?&gt;
</pre>
<p>这段代码将打印出101<br />
MongoCollection::count() 也可以查询字段数据</p>
<p><strong>使用游标得到集合中的所有文档</strong><br />
为了得到集合中的所有文档，我们可以使用 MongoCollection::find()方法，find()方法返回一个 MongoCursor对象，可以让我们重复得到查询<br />
所匹配的的文档</p>
<pre name="code" class="php">
&lt;?php
$cursor = $collection-&gt;find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?&gt;
</pre>
<p>这样我们会打印出集合中的这101个文档，$id就是文档中的_id字段，$value 就是文档本身</p>
<p><strong>为查询规定一个标准</strong><br />
我们可以通过find()方法得到集合中的文档子集，例如，我们要查询出集合中i字段为71的文档，我们可以使用下列方法</p>
<pre name="code" class="php">
&lt;?php
$query = array( "i" => 71 );
$cursor = $collection-&gt;find( $query );
while( $cursor-&gt;hasNext() ) {
var_dump( $cursor-&gt;getNext() );
}
?&gt;
</pre>
<p>我们将打印如下数据</p>
<pre name="code" class="php">
array(2) {
["_id"]=>
object(MongoId)#6 (0) {
}
["i"]=>
int(71)
["_ns"]=>
"testCollection"
}
</pre>
<p><strong>为查询设定一个范围</strong><br />
我们可以通过find()创建一个查询语句以得集合中的一个子集，例如如果我们得到所有&#8221;i&#8221;>50的文档，我们可以使用如下代码</p>
<pre name="code" class="php">
&lt;?php
$query = array( "i" => array(‘$gt’ =>50)); //注意’$gt’两边的单引号
$cursor = $coll-&gt;find( $query );

while( $cursor-&gt;hasNext() ) {
var_dump( $cursor-&gt;getNext() );
}
?&gt;
</pre>
<p>我们同样可以得到20 < i <= 30之间的数据

<pre name="code" class="php">
&lt;?php
$query = array( &#8220;i&#8221; => array( &#8220;\$gt&#8221; => 20, &#8220;\$lte&#8221; => 30 ) );
$cursor = $coll-&gt;find( $query );

while( $cursor-&gt;hasNext() ) {
var_dump( $cursor-&gt;getNext() );
}
?&gt;
</pre>
<p>我们非常容易漏掉$美元符号，你也可以选择你自定义的符号来代替美元符号，选择一个不会在你的建里面出现的符号例如&#8221;:&#8221;,在php.ini中加上这么一句话<br />
mongo.cmd = &#8220;:&#8221;<br />
那么上面的代码就可以替换成</p>
<pre name="code" class="php">
&lt;?php
$query = array( "i" => array( "\$gt" => 20, "\$lte" => 30 ) );
?&gt;
</pre>
<p>当然你也可以使用ini_set(&#8220;mongo.cmd&#8221;, &#8220;:&#8221;)的方法来改变</p>
<p><strong>创建一个索引</strong><br />
MongoDB支持索引，并且可以很容易的加到一个集合中，你只要指定某个字段为索引就行了，并且还可以指定 正序索引(1)与 倒序索引(-1)<br />
下面的代码为I创建了索引</p>
<pre name="code" class="php">
&lt;?php
$coll-&gt;ensureIndex( array( "i" => 1 ) );  //在"i"上创建了一个索引
$coll-&gt;ensureIndex( array( "i" => -1, "j" => 1 ) );//在"i"上创建了倒序索引 在"j"上创建了正序索引
?&gt;
</pre>
<p><strong>一个简单的列子</strong><br />
这个例子展示了如何链接mongodb数据库，如何选择数据库，如何插入数据，如何查询数据，以及关闭数据库链接</p>
<pre name="code" class="php">
&lt;?php
//链接
$m = new Mongo();

// 选择一个数据库
$db = $m-&gt;comedy;
$collection = $db-&gt;cartoons;

//添加一个元素
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection-&gt;insert($obj);

//添加另一个元素，使用不同的格式
$obj = array( "title" => "XKCD", "online" => true );
$collection-&gt;insert($obj);

//查询所有的集合
$cursor = $collection-&gt;find();

//重复显示结果
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}

// 关闭链接
$m-&gt;close();
?&gt;
</pre>
<p>输出结果为<br />
Calvin and Hobbes<br />
XKCD</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/php-operation-mongodb-276/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.718 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2025-11-24 10:53:52 -->
