逗逗谜 發表於 2020-12-26 23:31:00

MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门

<h1>一、关于MongoDB数据库:</h1>
<p>MongoDB 官网https://www.mongodb.com</p>
<p>MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。</p>
<p>MongoDB 可在高负载的情况下,添加更多的节点,可以保证服务器性能。</p>
<p>MongoDB 可为Web应用提供可扩展的高性能数据存储解决方案。</p>
<p>MongoDB 将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。</p>
<p>MongoDB&nbsp;是免费使用的(MongoDB分&nbsp;社区版[在所有环境下都免费]&nbsp;和 企业版[在开发环境免费,生产环境收费]两个版本)。</p>
<p>MongoDB 数据库具有可伸缩性和灵活性,可帮助你快速查询和索引你需要数据。</p>
<p>&nbsp;</p>
<h1>二、MongoDB数据库下载:</h1>
<h3>1、官方下载地址:&nbsp;https://www.mongodb.com/try/download</h3>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200828221400428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200828221153676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<p>在这里根据自己的需要,选择下载对应系统的MongoDB数据库版本(注:在MongoDB版本中,是偶数:如3.2.x、3.4.x、3.6.x表示正式版【可用于生产环境】,是奇数:3.1.x、3.3.x、3.5.x表示开发版,而OS系统版本:自动给你推荐你当前适合的MongoDB数据库版本)。</p>
<p>然后点击&nbsp;Download按扭后,进入下载页面:</p>
<p>&nbsp;</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200828221441746.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>注:进入上面这个下载页面后,会自动开始下载!!!(如没反应就F5 刷新一下当前页面,由于是外网,所以就耐心点吧!)。</p>
<h3>&nbsp;</h3>
<h3>&nbsp;</h3>
<h3>2、其他下载方式:除了上面的下载方式以外,也可以试试下面的下载链接!!</h3>
<ol>
<li>MongoDB Windows系统64位下载地址:http://www.mongodb.org/dl/win32/x86_64</li>
<li>MongoDB Windows系统32位下载地址:http://www.mongodb.org/dl/win32/i386</li>
<li>MongoDB 全部版本下载地址:http://www.mongodb.org/dl/win32</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>三、MongoDB数据库的安装:</h1>
<p>MongoDB的安装非常简单,在下载完成后,接直接双击下载好的MongoDB安装包,进入MongoDB安装界面,点击Next下一步、同意条款、选择安装路径 和 日志路径、勾选是否安装MongoDB Compass(MongoDB数据库图形管理工具,类似MySQL的Navicat&nbsp;),其它的步骤一直点下一步直到完成安装就OK啦。</p>
<p>点击开始安装:</p>
<p><img alt="" class="has lazyload" data-src="https://img-blog.csdnimg.cn/20200829203621553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>&nbsp;</p>
<p>选择MongoDB安装方式:</p>
<p><img alt="" class="has lazyload" data-src="https://img-blog.csdnimg.cn/20200829203709594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>&nbsp;</p>
<p>选择MongoDB安装路径:&nbsp;</p>
<p>注意:MongoDB 3.x系列版本的数据库,在安装成功后,每次在使用前都需要手动启动MongoDB服务!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">启动命令:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod <span class="hljs-comment">--dbpath 数据库路径</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">如:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongodb <span class="hljs-comment">--dbapth D:/database/mydb</span></div>
</div>
</li>
</ol>
<p>现在:MongoDB 4.x系列版本的数据库,在安装时默认安装(选中了 Install MongoD as a Service)服务 ,就是在开机时自动启动 MongoDB 服务,然后就可以直接使用啦!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 在Windows环境下:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">1、运行 <span class="hljs-selector-tag">Win + <span class="hljs-selector-tag">R</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">2、输入 <span class="hljs-selector-tag">services<span class="hljs-selector-class">.msc 命令便可以查看到 <span class="hljs-selector-tag">MongoDB <span class="hljs-selector-tag">Server (MongoDB) 服务啦!!</span></span></span></span></span></div>
</div>
</li>
</ol>
<p>MongoDB 4.x安装具体如下所示:</p>
<div>
<p><img alt="" data-src="https://img-blog.csdnimg.cn/20200829203812925.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<p>选择MongoDB数据库图形化界面管理工具:&nbsp;</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200829203917208.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<p>然后就一直下一步、Next&nbsp;直到 Flnish 安装完毕,到此就MongoDB就安装结束啦!</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200829204330294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<h1>四、MongoDB数据库可视(图形)化管理工具:</h1>
<h3>1、下载地址:https://www.mongodb.com/try/download/compass</h3>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200828225611237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<h3>2、注意事项:在MongoDB Compass选择下载时,可选择对应的系统版本(这里以windows系统为例):</h3>
<ul>
<li>zip绿色版(免安装,解压后就可以用)</li>
<li>msi安装版(Windows Installer的数据包,需要一步步安装到本地)</li>
<li>exe安装版(可执行文件,需要一步步安装到本地)</li>
</ul>
<p>&nbsp;</p>
<p>下面是Msi安装版,安装界面:</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/2020082923175012.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>MongoDB Compass的安装没有什么好配置的,直接点击 Next 至到&nbsp;Flnish 就安装结束啦!</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/2020083000093635.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>MongoDB数据库的图形化的数据库管理工具,可以在这里面对数据进行很友好的操作:如查看、编辑、导入、导出等相应的。</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200829200326522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>五、文件功能解释:</h1>
<div>
<pre name="code" class="has"><code class="language-javascript hljs">MongoDB v3<span class="hljs-number">.6版 安装目录:C:\Program Files\MongoDB\Server\<span class="hljs-number">3.6\bin</span></span></code></pre>
</div>
<p><img alt="" width="907" height="541" class="has lazyload" data-src="https://img-blog.csdn.net/20180606111415174"></p>
<div>
<pre name="code" class="has"><code class="hljs apache"><span class="hljs-attribute">MongoDB v<span class="hljs-number">4.<span class="hljs-number">4版 安装目录:C:\Program Files\MongoDB\Server\<span class="hljs-number">4.<span class="hljs-number">4\bin</span></span></span></span></span></code></pre>
</div>
<div>
<p><img alt="" data-src="https://img-blog.csdnimg.cn/20200831102830401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<h1>&nbsp;</h1>
<h1>六、环境变量配置:</h1>
<h3>1、配置MongoDB全局环境变量(就是在电脑中任何地方都可以合用mongo、mongod等命令)!</h3>
<p><img src="https://img-blog.csdn.net/20180606112139462"></p>
<p>注:配置完成后,重启电脑, 环境变量才生效哦!重启后,我们就能在系统的任何位置,使用mongo命令了:</p>
<p>如:查看MongoDB数据库存的版本:</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod -version</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 该命令会显示MongoDB数据库的相关信息,如果能显示信息,就表示已安装成功了!!!</span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3>2、MongoDB数据库中的常用述语:</h3>
<p>1、在MongoDB中,数据库是以文件形式存储的,数据库目录中存储了相应的数据库!</p>
<p>2、在MongoDB中,把传统数据库中的 "表"&nbsp;叫作:Collections "集合"!</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;3、在MongoDB中,向集合存储数据时,直接以JSON格式,进行存取操作!</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;4、在MongoDB中,集合中的数据叫作:Documents "文档"!</p>
<p>&nbsp;</p>
<h3>3、进入MongoDB数据库的语法环境:</h3>
<p>在命令窗口中,输入 mongo 回车,&nbsp;就进入了MongoDB数据库的语法环境了!</p>
<p>注:安装好MongoDB数据库后,默认是【非授权模式】(也就是不需要任何权限验证,直接在命令窗口中输入 mongo 回车,就连接上了)。</p>
<p>MongoDB默认IP 和 端口是:mongodb://127.0.0.1:27017 或 mongodb://localhost:27017</p>
<div>
<p><img alt="" class="has lazyload" data-src="https://img-blog.csdnimg.cn/201910292341341.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<h1>七、MongoDB账户权限配置:</h1>
<p>由于:安装好MongoDB数据库后,默认是【非授权模式】(也就是不需要任何权限验证、不需要验证账户,直接在命令窗口中输入 mongo 回车,就可以进行相关操作),这是非常不安全的(尤其是在生产环境中,当然如果是自己玩玩的话就无所谓了)!!</p>
<p>所以:为了数据的安全,我们都应该去配置数据库的访问权限 和 修改默认(mongodb://127.0.0.1:27017)连接绑定IP 和 端口号!!</p>
<h3>1、创建MongoDB超级管理用户:</h3>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">#1、进入mongo语法环境</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongo</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">#2、创建admin数据库</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">use <span class="hljs-keyword">admin</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">#3、添加管理员用户(用户名admin 和 密码123456 是可以自定义的 【但是要记牢哦!!】)</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.createUser({</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">user:<span class="hljs-string">"admin",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">pwd:<span class="hljs-string">"123456",</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">roles:[<span class="hljs-string">"root"] // 角色root是超级管理员 </span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">})</div>
</div>
</li>
</ol>
<ul>
<li>MongoDB数据库账户配置常用命令:</li>
</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 查看当前数据库中的用户</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">show <span class="hljs-keyword">users</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">或:db.getUsers()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 登录认证</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.auth(<span class="hljs-string">"admin", <span class="hljs-string">"123456")</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 创建用户</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.createUser({</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">user:<span class="hljs-string">"admin", // 用户名</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">pwd:<span class="hljs-string">"123456", // 密码</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">roles:[<span class="hljs-string">"root"] // 角色</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">})</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 修改用户密码</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.updateUser( <span class="hljs-string">"admin", {</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">pwd: <span class="hljs-string">"abc666"</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">})</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 删除用户</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.dropUser(<span class="hljs-string">"admin") // <span class="hljs-keyword">admin 是要删除的用户名</span></span></div>
</div>
</li>
</ol>
<ul>
<li>MongoDB数据库中的内置角色:</li>
</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(1)、【数据库用户角色】针对每一个数据库进行控制。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">read:提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">readWrite:包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(2)、【数据库管理角色】每一个数据库包含了下面的数据库管理角色。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">dbOwner:该数据库的所有者,具有该数据库的全部权限。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/<span class="hljs-comment">#dbAdmin)</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(3)、【集群管理权限】admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">clusterMonitor:仅仅监控集群和复制集。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括<span class="hljs-keyword">backup、<span class="hljs-keyword">restore等等。</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(<span class="hljs-number">4)、【所有数据库角色】</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">admin:数据库提供了一个mongod实例中所有数据库的权限角色:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">readAnyDatabase:具有<span class="hljs-keyword">read每一个数据库权限。但是不包括应用到集群中的数据库。</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(<span class="hljs-number">5)、【超级管理员权限】</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">root: dbadmin到<span class="hljs-keyword">admin数据库、useradmin到<span class="hljs-keyword">admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(<span class="hljs-number">6)、【备份恢复角色】</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">backup:数据库备份</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">restore:数据库恢复</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">(<span class="hljs-number">7)、【内部角色】</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">__system</div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3>2、修改MongoDB数据库配置:</h3>
<p>MongoDB数据库的相关配置信息,是存储在mongodb安装目录bin目录中的mongod.cfg文件中,</p>
<p>注:在修改mongod.cfg文件之前,请记得要先备份一份哦,以防万一!!</p>
<p><img alt="" data-src="https://img-blog.csdnimg.cn/20201203151911801.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>如上图所示,开启数据库访问权限验证:修改完成后,记得要保存哦!!</p>
<p>注:前面代有 # 的配置项,表示被注释(无效)状态的)</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 开启数据库访问权限验证(注意:换行、缩进格式哦!!)</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">security:<span class="hljs-string">&nbsp;</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-meta">&nbsp; <span class="hljs-string">authorization: enabled</span></span></div>
</div>
</li>
</ol>
<h3>3、重新启动MongoDB服务</h3>
<p>注:只要修改了mongod.cfg文件,一定要重新启mongodb服务后才会生效哦!!</p>
<p>打开服务步骤:</p>
<p>此电脑(计算机) 右键 -&gt; 管理 -&gt; 服务和应用程序 -&gt; 服务 -&gt; MongoDB Server (MongoDB) -&gt; 右键 点击 重新启动(E)或 点击左侧的(<span style="text-decoration: underline">重启动</span>此服务)</p>
<p>或者 Win + R 运行&nbsp;services.msc 也能打开如下 服务界面,找到&nbsp;MongoDB Server (MongoDB) -&gt; 右键 点击 重新启动(E)或 点击左侧的(<span style="text-decoration: underline">重启动</span>此服务)</p>
<p><img src="https://img-blog.csdnimg.cn/20201203153859204.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<h3>4、用刚才创建好的超级管理账户连接数据库:</h3>
<p>注:重新启动mongodb服务后,用一个新的命令窗口来做操作:通过如下图所示,在配置账户权限后,直接在命令窗口中用 mongo 命令,运行相关的操作是没有响应的,只有在正确的输入账户和密码后才进行相关操作!!</p>
<p>连接本地MongoDB数据库:(不用指定 绑定IP 和 端口号)</p>
<p><img src="https://img-blog.csdnimg.cn/20201203161635888.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>连接运程MongoDB数据库:(必须指定 绑定IP 和 端口号)</p>
<p><img src="https://img-blog.csdnimg.cn/20201203162259925.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>&nbsp;</p>
<h3>5、给指定的数据库存配置账户:</h3>
<p>这里以 myweb 数据库为例,给myweb配置一个账户,注:各个不同的数据库之间,可以创建有一个 或 多个账户,各数据库之间账户、密码都是独立的,不能互相访问!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 给myweb数据库 创建一个名为:mupiao 的账户,角色为:dbOwner</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.createUser({</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">user:<span class="hljs-string">"mupiao", </span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">pwd: <span class="hljs-string">"123456", </span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">roles: [{</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">role: <span class="hljs-string">"dbOwner", </span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">db: <span class="hljs-string">"myweb"</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">}]</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">})</div>
</div>
</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20201203165111829.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<h3>6、连接指定的MongoDB数据库</h3>
<p>这里就用上面在 myweb数据库中创建的账户来演示 连接过程!</p>
<p>在命令窗口中连接:</p>
<p><img src="https://img-blog.csdnimg.cn/20201203171212357.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>在MongoDBCompass 可视化工具中连接:</p>
<p><img src="https://img-blog.csdnimg.cn/20201203172015852.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70"></p>
<p>&nbsp;</p>
<h1>八、MongoDB数据库常用命令:</h1>
<p>上面就是MongoDB数据库的语法环境了,现在我们可以在命令窗口中执行一些MongoDB数据库的命令、语法啦!下面例出了一些常用的MongoDB数据库操作命令!</p>
<p>&nbsp;</p>
<h3>1、查看所有数据库:</h3>
<pre><code class="language-sql hljs"><span class="hljs-keyword">show dbs</span></code></pre>
<p>&nbsp;</p>
<h3>2、查看当前所在数据库:</h3>
<div>
<pre name="code" class="has"><code class="language-sql hljs">db</code></pre>
</div>
<p>&nbsp;</p>
<h3>3、查看当前所在数据库中所有集合:</h3>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">show <span class="hljs-selector-tag">collections</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 查看user集合(用户表)中的所有记录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.user<span class="hljs-selector-class">.find()<span class="hljs-selector-class">.pretty()</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 加上.pretty() 让显示结果更友好明了!</span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3>4、查看当前数据库相关信息(名称、文档个数、视图、索引、大小等):</h3>
<div>
<pre name="code" class="has"><code class="language-sql hljs">db.stats()</code></pre>
</div>
<h3><br>5、创建、打开、切换 数据库:</h3>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">use 数据库名字</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">// 如:<span class="hljs-keyword">use mydb</span></div>

</div>

</li>

</ol>
<p>&nbsp;</p>
<p>use 这个命令很特殊:</p>
<p>use命令具有打开、 切换、 创建数据库的功能:&nbsp;</p>
<ol>
<li>如果打开的这个数据库存在就是打开这个数据库。</li>
<li>如果打开的是一个不存在的数据库(没有这个数据库名字),那么就会创建一个同名的数据库。</li>

</ol>
<p>注:在MongoDB中创建一个新的数据库时,需要向数据库中创建一个集合(collections【就像关系数据库中的表】),并且插入一条数据,这个数据库才能创建成功!!</p>
<p>如:往集合中插入一条数据。可以不用先创建集合,直接往里添加数据即可:</p>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.user.insert({<span class="hljs-string">"name": <span class="hljs-string">"xiaoming"})   <span class="hljs-comment">// user 就是集合(表)名</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">或</div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.user.save({<span class="hljs-attr">name:<span class="hljs-string">"沐枫", <span class="hljs-attr">job:<span class="hljs-string">"Web前端"})<span class="hljs-comment">// 效果和上面一样,都是添加数据</span></span></span></span></span></div>

</div>

</li>

</ol></div>
<p>当命令执行后,数据库系统发现student是一个数据集合不存的,就自动创建一个集合,并随着数据的插入,数据库和集合也就真正的创建成功了。</p>
<h3><br>6、删除数据库(注:这里是删除当前所在的数据库)</h3>
<p>注:这个命令一定要慎用,一旦该命令一执行一下当前所在数据库中的所有数据都玩完了!!!,除非您想删库跑路,哈哈!!</p>
<div>
<pre name="code" class="has"><code class="language-sql hljs">db.dropDatabase()</code></pre>
</div>
<p>&nbsp;</p>
<h3>7、清屏(这是Dos的命令,当窗口中的内容太多时,可以使用该命令,清除屏幕内容,保持界面清晰):</h3>
<div>
<pre name="code" class="has"><code class="language-sql hljs">cls</code></pre>
</div>
<h2>&nbsp;</h2>
<h3>8、MongoDB&nbsp;数据库备份与恢复,集合导入与导出:</h3>
<p>MongoDB数据库的备份与恢复可直接在命令行工具中完成:</p>
<p>命令说明:</p>
<ul>
<li>mongodump&nbsp;:&nbsp; &nbsp; &nbsp;//数据库备份</li>
<li>mongorestore:&nbsp; &nbsp; //数据库恢复(还原备份)</li>
<li>mongoimport:&nbsp; &nbsp; &nbsp;//没集合导入</li>
<li>mongoexport:&nbsp; &nbsp; &nbsp;//集合导出</li>
</ul>
<p>参数说明:</p>
<ul>
<li>-h 数据库IP地址:&nbsp;//如果是当前本机数据库,可以去掉-h</li>
<li>--port&nbsp;端口号:&nbsp; &nbsp; &nbsp;//如果是默认端口,可以去掉--port</li>
<li>-u&nbsp;用户名:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//如果没有用户,可以不用指定-u</li>
<li>-p&nbsp;密码:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //如果没有密码,可以不用指定-p</li>
<li>-d&nbsp;数据库名称:&nbsp; &nbsp;//如果不指定则导出所有数据库</li>
<li>-c&nbsp;集合名称</li>
<li>-o&nbsp;文件存在路径&nbsp;</li>
<li>注:每个参数前后是有空格的哦!!</li>
</ul>
<p>--drop&nbsp; &nbsp; &nbsp;// 清空集合原有数据</p>
<p>--file xxx.json&nbsp; &nbsp;// 指定文件</p>
<p>注:除了用命令进行导入导出以外,还可以用MongoDB Compass(数据库图形管理工具)进行导入导出等操作!!</p>
<p>使用&nbsp;mongodump&nbsp;命令来备份&nbsp;MongoDB&nbsp;数据。该命令可以导出所有数据到指定目录中。mongodump&nbsp;命令可以通过参数指定导出的数据量级转存的服务器。</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">语法格式:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">mongodump <span class="hljs-string">-h 数据库地址 -d 数据库名称 -o 数据库备份输出路径</span></span></div>
</div>
</li>
</ol>
<p>使用mongorestore&nbsp;命令来恢复备份的数据。</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">恢复语法格式:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">mongorestore <span class="hljs-string">-h 数据库地址 -d 数据库名称 数据库备份存储路径</span></span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<p>将JSON文件形式将数据导入到数据库 指定的集合中:</p>
<p>项目开发有时候需要一些测试数据,如一条条的insert在繁琐了。所以,我们可以在代码编辑器中以json格式编辑好要插入的数据,以.json文件格式保存,然后导入到数据库中:</p>
<p>下面就是将mydata.json文件,导入到test数据库的student集合中。</p>
<pre><code class="language-javascript hljs">mongoimport -d mydb&nbsp;-c user&nbsp;--drop&nbsp;--file D:\db\mydata.json
</code></pre>
<p>&nbsp;</p>
<p>以JSON文件形式将数据库 指定的集合导出:</p>
<pre><code class="hljs groovy">mongoexport -d mydb&nbsp;-c user&nbsp;-o <span class="hljs-attr">D:\db\mydata.json</span></code></pre>
<p>&nbsp;</p>
<h2>&nbsp;</h2>
<h3>9、操作帮助命令(列出MongoDB数据库所有的操作方法)</h3>
<div>
<pre name="code" class="has"><code class="language-sql hljs">db.help()</code></pre>
</div>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">DB methods:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command </div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.aggregate(, {options}) - performs a collectionless aggregation on this database; returns a cursor</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.auth(username, password)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.cloneDatabase(fromhost)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.commandHelp(name) returns the <span class="hljs-keyword">help <span class="hljs-keyword">for the command</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.copyDatabase(fromdb, todb, fromhost)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.createCollection(<span class="hljs-keyword">name, {<span class="hljs-keyword">size: ..., capped: ..., <span class="hljs-keyword">max: ...})</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.createView(<span class="hljs-keyword">name, viewOn, [{$<span class="hljs-keyword">operator: {...}}, ...], {viewOptions})</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.createUser(userDocument)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.currentOp() displays currently executing <span class="hljs-keyword">operations <span class="hljs-keyword">in the db</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.dropDatabase()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.eval() - deprecated</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.fsyncLock() <span class="hljs-keyword">flush <span class="hljs-keyword">data <span class="hljs-keyword">to disk <span class="hljs-keyword">and <span class="hljs-keyword">lock <span class="hljs-keyword">server <span class="hljs-keyword">for backups</span></span></span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.fsyncUnlock() unlocks <span class="hljs-keyword">server <span class="hljs-keyword">following a db.fsyncLock()</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.getCollection(cname) same <span class="hljs-keyword">as db[<span class="hljs-string">'cname'] <span class="hljs-keyword">or db.cname</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.getCollectionInfos() - <span class="hljs-keyword">returns a <span class="hljs-keyword">list that contains the <span class="hljs-keyword">names <span class="hljs-keyword">and options <span class="hljs-keyword">of the db<span class="hljs-string">'s collections</span></span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getCollectionNames()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getLastError() - just returns the err msg string</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getLastErrorObj() - return full status object</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getLogComponents()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getMongo() get the server connection object</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getMongo().setSlaveOk() allow queries on a replication slave server</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getName()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getPrevError()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getProfilingLevel() - deprecated</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getProfilingStatus() - returns if profiling is on and slow threshold</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getReplicationInfo()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getSiblingDB(name) get the db at the same server as this one</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> db.hostInfo() get details about the server's host</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.isMaster() <span class="hljs-keyword">check replica primary <span class="hljs-keyword">status</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.killOp(opid) kills the <span class="hljs-keyword">current operation <span class="hljs-keyword">in the db</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.listCommands() lists <span class="hljs-keyword">all the db commands</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.loadServerScripts() loads <span class="hljs-keyword">all the scripts <span class="hljs-keyword">in db.system.js</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.logout()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.printCollectionStats()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.printReplicationInfo()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.printShardingStatus()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.printSlaveReplicationInfo()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.dropUser(username)</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.repairDatabase()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.resetError()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.runCommand(cmdObj) run a <span class="hljs-keyword">database command. <span class="hljs-keyword">if cmdObj <span class="hljs-keyword">is a <span class="hljs-keyword">string, turns it <span class="hljs-keyword">into {cmdObj: <span class="hljs-number">1}</span></span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.serverStatus()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.setLogLevel(<span class="hljs-keyword">level,&lt;component&gt;)</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.setProfilingLevel(<span class="hljs-keyword">level,slowms) <span class="hljs-number">0=<span class="hljs-keyword">off <span class="hljs-number">1=slow <span class="hljs-number">2=<span class="hljs-keyword">all</span></span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.setWriteConcern(&lt;write concern doc&gt;) - <span class="hljs-keyword">sets the write concern <span class="hljs-keyword">for writes <span class="hljs-keyword">to the db</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.unsetWriteConcern(&lt;write concern doc&gt;) - unsets the write concern <span class="hljs-keyword">for writes <span class="hljs-keyword">to the db</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.setVerboseShell(flag) display extra information <span class="hljs-keyword">in shell <span class="hljs-keyword">output</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.shutdownServer()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.stats()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.version() <span class="hljs-keyword">current <span class="hljs-keyword">version <span class="hljs-keyword">of the <span class="hljs-keyword">server</span></span></span></span></div>
</div>
</li>
</ol></div>
<h2>&nbsp;</h2>
<h1>九、启动 或 创建 指定的MongoDB数据库:</h1>
<p>MongoDB数据库是以文档形式存储的,我们可以根自己的项目需要,在各自不同的项目中,指定MongoDB数据库目录(如在Vue 或 React 项目的根目录,和 package.json文件同级的目录中,创建一个名为database的文件夹)中去创建MongoDB数据库的存储目录!</p>
<p>使用 mongod 命令: 创建 或 启动 指定的MongoDB数据库!</p>
<p>mongod这个命令很特殊,和use命令一样,如果指定的目录中有数据库就是启动,没有就是创建并启动!</p>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod <span class="hljs-comment">--dbpath 数据库目录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">// 如: mongod <span class="hljs-comment">--dbpath D:\Vue\myapp\database</span></div>
</div>
</li>
</ol></div>
<p>如果mongodb数据库路径太长,要输入很久,还可这样做</p>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-number">1<span class="hljs-string">、在dos命令行中先输入以下命令:</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">mongod <span class="hljs-string">--dbpath </span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-number">2<span class="hljs-string">、需要注意思的是,在--dbpath的后面加上一个空格</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-number">3<span class="hljs-string">、找到数据库所在的目录文件夹,直接将这个文件夹拖到命令窗口中去</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-number">4<span class="hljs-string">、此时,数据库的路径有自动有啦!!</span></span></div>
</div>
</li>
</ol></div>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200829192249255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>注意:</p>
<p>启动成功后,一定不要关闭这个命令窗口,而且这个命令窗口中也不能再做其他操作了,然后就可以在MongoDB图形化管理工具中看查数据库 或 在项目中链接使用MongoDB数据库啦。</p>
<p>当然在有些时候,如果想要用命令行操作MongoDB数据库的话,就要再打开一个新Dos窗口!!!</p>
<p>输入mongo命令就进入了MongoDB数据库的语法环境了(一定要先启动MongoDB数据库后,在进行MongoDB数据库的操作)。</p>
<div>
<p><img src="https://img-blog.csdnimg.cn/20200829194644536.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L211Z3VsaTIwMDg=,size_16,color_FFFFFF,t_70">​</p>
</div>
<p>&nbsp;</p>
<h1>&nbsp;</h1>
<h1>十、MongoDB数据库-复制集</h1>
<h3>1、为什么要用复制集?</h3>
<p>为了保证数据的安全,推荐使用复制集的方式来存储数据,一般复制集节点数至少要有3个,就相当于有3个MongoDB数据库,一主两从,这样一来,即便是当主节点宕机了,其他的从节点通过投票选举(所以,一般复制集节点数量不能是偶数,不然就会出现评局的状态),选出一个新的主节点出来继续工作,而且数据也不会丢失!!</p>
<p>&nbsp;</p>
<h3>2、在windows系统下搭建MongoDB复制集:</h3>
<p>1、新建MongoDB复制集节点目录,如:在D盘下的MongoDB目录下,新建3个文件夹,分别命名为:db1,db2,db3 用于存放复制集节点</p>
<p>2、分别在db1,db2,db3这3个文件夹中新建一个文件命名为:mongod.conf 内容如下:</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># mongod.conf 文件</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">systemLog:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;destination: file</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;path: D:\MongoDB\db1\mongod.log &nbsp; <span class="hljs-comment"># 设置日志文件存放路径</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;logAppend: true</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">storage:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;dbPath: D:\MongoDB\db1 &nbsp; <span class="hljs-comment"># 数据存储目录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">net:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;bindIp: <span class="hljs-number">0.0<span class="hljs-number">.0<span class="hljs-number">.0 &nbsp; &nbsp; <span class="hljs-comment"># 数据库地址:0.0.0.0 表示所有</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;port: <span class="hljs-number">28017 &nbsp; &nbsp; <span class="hljs-comment"># 数据库端口号</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">replication:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;replSetName: rs0 &nbsp; &nbsp;<span class="hljs-comment"># 复制集节点名称</span></div>
</div>
</li>
</ol>
<p>注:</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">* path 和 dbPath 配置项中的路径一定要和当前所有的目录名对应!如:db1,db2,db3</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">* port 数据库端口号也不能重复!如:28017,28018,28019</div>
</div>
</li>
</ol>
<p>如:db2目录下的mongod.conf 内容如下</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># mongod.conf 文件</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">systemLog:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;destination: file</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;path: D:\MongoDB\db2\mongod.log &nbsp; <span class="hljs-comment"># 设置日志文件存放路径</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;logAppend: true</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">storage:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;dbPath: D:\MongoDB\db2 &nbsp; <span class="hljs-comment"># 数据存储目录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">net:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;bindIp: <span class="hljs-number">0.0<span class="hljs-number">.0<span class="hljs-number">.0 &nbsp; &nbsp; <span class="hljs-comment"># 数据库地址:0.0.0.0 表示所有</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;port: <span class="hljs-number">28018 &nbsp; &nbsp; <span class="hljs-comment"># 数据库端口号</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">replication:</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp;replSetName: rs0 &nbsp; &nbsp;<span class="hljs-comment"># 复制集节点名称</span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3>3、启动复制集节点</h3>
<p>注:由于windows系统不支持fork,以所要分别用不同的命令窗口来启动,如这里有3个复制集节点,所有就要开3个命令窗口来打开,这样就会启动3个mongodb进程,并且启动后不能关闭该命令窗口,否则进程也会随之结束!!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 命令窗口1</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod -f D:\MongoDB\db1\mongod.conf</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 命令窗口2</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod -f D:\MongoDB\db2\mongod.conf</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 命令窗口3</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongod -f D:\MongoDB\db3\mongod.conf</div>
</div>
</li>
</ol>
<p>通过以上命令启动好3个复制集节点后,可以在命令窗口中查看,mongodb的进程情况</p>
<pre><code class="language-javascript hljs">ps mongo</code></pre>
<p>&nbsp;</p>
<h3>4、关联复制集节点</h3>
<p>上面虽然创建了3个复制集节点,但它们之间还没有任何关系,还是相互独立的,所以要将们关联起来,当有数据入后3个节点都会有数据,这样一来,即便是当主节点宕机了,其他的从节点通过投票选举(所以,一般复制集节点数量不能是偶数,不然就会出现评局的状态),选出一个新的主节点出来继续工作,而且数据也不会丢失!!</p>
<ol>
<li>
<p>再新开一个命令窗口操作,在windows系统中查看当前hostname 主机名</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">hostname</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># MuGuiLin //这是我在windows系统中查看当前hostname 主机名</span></div>
</div>
</li>
</ol>
<p>注:如果各个复制集节点之间不是在同一台服务器上(当然推荐分开部署,这里为了演示所以就在一台电脑上),就需要对应的服务器IP 或域名</p>
<p>&nbsp;</p>
</li>
<li>
<p>然后进入28017节点</p>
<pre><code class="language-python hljs">mongo localhost:<span class="hljs-number">28017</span></code></pre>
<p>&nbsp;</p>
</li>
<li>
<p>设置复制集主节点,在没有设置复制集主节点之前,各个节点都是一样平级的,但一般情况下,我们都将第1个端口号的节点做为主节点!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs.initiate()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 执行以上命令后就进入复制集节点状态了</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:SECONDARY&gt; 回车 <span class="hljs-comment"># 默认是从节点状态,按回车键可切换到主节点状态</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt; <span class="hljs-comment"># PRIMARY 表示进入主节点状态了</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
</ol>
<p>&nbsp;</p>
</li>
<li>
<p>查看复制集节点状态信息 和 配置信息</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;rs.status()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;rs.config()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 通过以上命令可以查看复制集节点的相关信息,其中"members":[...] 数组中就是各个节点的信息,由于还没有关联其他的节点,所以现在只有一个</span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
</li>
<li>
<p>分别关联端口为28018 和 28019 的这两个复制集节点</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;rs.add(<span class="hljs-string">"MuGuiLin:28018")</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;rs.add(<span class="hljs-string">"MuGuiLin:28019")</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 执行以上命令后,再查看复制集节点,在"members":[] 数组中应该就有3个节点信息了</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;rs.status()</div>
</div>
</li>
</ol>
<p>到此复制集节点的关联工作就完成了!</p>
</li>
</ol>
<p>&nbsp;</p>
<h3>5、查看从节点是否正常同步数据</h3>
<p>1、先在28017主节点上插入一条数据</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 进入28017节点</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongo localhost:<span class="hljs-number">28017</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 查看所以数据库</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;show dbs</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 向test数据库中的test集合插入一条数据</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;db.test.insert({name: <span class="hljs-string">"OK 666 MongoDB 数据库 复制集"})</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 查看当前数据库下的所有集合</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;show collections</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 查看test集合中的所有数据</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:PRIMARY&gt;db.test.find().pretty()</div>
</div>
</li>
</ol>
<p>writeConcern 数据写入配置:</p>
<p>注意:默认情况下插入数据时只要写入主节点(不管是否同步到从节点)就返回提示数据写入成功。&nbsp;&nbsp;</p>
<p>所以:如果要保证在写入数据时,所的的节点 或 指定的节点都落盘(成功写入)后,才返回提示数据写入成功。</p>
<p>writeConcern&nbsp;决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:</p>
<ul>
<li>0 表示发起写操作,不关心是否成功;&nbsp;</li>
<li>1~集群最大数据节点数 表示写操作需要被复制到指定节点数才算成功;</li>
<li>majority 表示写操作需要被复制到大多数节点上才算成功。 发起写操作的程序将阻塞到写操作到达指定的节点数为止</li>
</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">例如:指定写入3个节点才算成功</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">rs0:SECONDARY&gt;db.test.insert({name: <span class="hljs-string">"插入一条测试数据 -&gt; 我要等3个复制集节点都插入成功了,我才返回功能!"<span class="hljs-string">},{writeConcern:{w:3}})</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># writeConcern 参数说明:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">w: <span class="hljs-string">节点数</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">w: <span class="hljs-string">"majority" <span class="hljs-comment"># 大多数节点确认模式(一半以上: 共3有个节点,只要2个节点写入成功即可)</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">w: <span class="hljs-string">"all" <span class="hljs-comment"># 全部节点确认模式</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">writeConcern中的另一个参数:j <span class="hljs-string">可以决定写操作到达多少个节点才算成功,journal <span class="hljs-string">则定义如何才算成功。</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">取值包括:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">j: <span class="hljs-literal">true <span class="hljs-string">表示写操作落到 <span class="hljs-string">journal <span class="hljs-string">文件中才算成功!</span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attr">j: <span class="hljs-literal">false <span class="hljs-string">表示写操作到达内存即算作成功!</span></span></span></div>
</div>
</li>
</ol>
<p>writeConcern注意事项:</p>
<ul>
<li>虽然多于半数的 writeConcern 都是安全的,但通常只会设置 majority,因为这是 等待写入延迟时间最短的选择;</li>
<li>不要设置 writeConcern 等于总节点数,因为一旦有一个节点故障,所有写操作都 将失败;</li>
<li>writeConcern 虽然会增加写操作延迟时间,但并不会显著增加集群压力,因此无论 是否等待,写操作最终都会复制到所有节点上。设置 writeConcern 只是让写操作 等待复制后再返回而已;</li>
<li>应对重要数据应用 {w: “majority”},普通数据可以应用 {w: 1} 以确保最佳性能;</li>
</ul>
<p>&nbsp;</p>
<p>2、在从节点28018 或 28019中查看是否有数据同步过来</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 进入28019节点</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">mongo localhost:<span class="hljs-number">28019</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 开启从节点读的权限,默认情况下,从节点是不能读取的,所以要开启读的权限rs.slaveOk()</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:SECONDARY&gt; rs.slaveOk()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 查看test集合中的所有数据</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">rs0:SECONDARY&gt;db.test.find().pretty()</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">​</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment"># 执行以上查看命令后,如果能够正常显示在主节点28017上插入的数据,就表示数据已经同步过来啦!!!</span></div>
</div>
</li>
</ol>
<p><code class="language-html">注:由于所有点节点都是在同一个电脑上或在同一个局域网内的,节点之间的数据同步速度是非常快的,一般在10ms内就能同步完成,如果是跨区域的、或是在不同的数据中心的,会受物理条件的影响,同频时间可能会延时长一点!!</code>&nbsp;</p>
<h1>&nbsp;</h1>
<h1>&nbsp;</h1>
<h1>十一、MongoDB数据库-模型设计</h1>
<h3>1、什么是数据模型?</h3>
<p>数据模型是一组由符号、文本组成的集合,用以准确表达信息,达到有效交流、沟通的目的。</p>
<p>&nbsp;</p>
<h3>2、数据模型的三要素:</h3>
<p>实体、属性、关系</p>
<p>基础的建模实际上就是对关系的各种表达:1:1 (一对一),1 :N (一对多),M :N (多对多);</p>
<p>而在MongoDB的文档中基本上都可以用内嵌方式、数据方式来完成这些关系的表述,就不用像传统的关系型数据库去做分表存储啦!而且:MongoDB也可以进行分集合(表)存储的哦!!!;</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 可以用对象、数组来处理一对多 或 多对多的关系</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"username": <span class="hljs-string">"沐枫",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"sex": <span class="hljs-string">"男",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"job": <span class="hljs-string">"Web全栈",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"image": {</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"live": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"travel": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"working": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg"</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">},</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"addresses": [</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"住址"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"公司"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"老家"}</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">],</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"hobbys": [</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"name": <span class="hljs-string">"打球"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"name": <span class="hljs-string">"看书"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"name": <span class="hljs-string">"上网"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"name": <span class="hljs-string">"旅游"}</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">]</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">}</div>
</div>
</li>
</ol>
<p>上面这种处理方式虽然好用,但是 例如:当hobby子文档数据量很多时,数据就会很冗余,好的是MongoDB从3.2版开始也可以进行分集合(表),将hobby文档抽离成一个独立的集合user_hobby,然后进行关联查询!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// users集合 把原来的users集合中的hobbys字段抽离到独立的user_hobby集合中</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"username": <span class="hljs-string">"沐枫",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"sex": <span class="hljs-string">"男",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"job": <span class="hljs-string">"Web全栈",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"image": {</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"live": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"travel": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg",</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"working": <span class="hljs-string">"https:www.xxx.com/update/xxx.jpg"</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">},</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"addresses": [</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"住址"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"公司"},</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{<span class="hljs-string">"type": <span class="hljs-string">"老家"}</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">],</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">"hobbys": [<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3, <span class="hljs-number">4]</span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">}</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 新抽离出来的user_hobby集合</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{hobby_id<span class="hljs-string">": 1, "name<span class="hljs-string">": "打球<span class="hljs-string">"},</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> {hobby_id": <span class="hljs-number">2, <span class="hljs-string">"name": <span class="hljs-string">"看书"},</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{hobby_id<span class="hljs-string">": 3, "name<span class="hljs-string">": "上网<span class="hljs-string">"},</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string"> {hobby_id": <span class="hljs-number">4, <span class="hljs-string">"name": <span class="hljs-string">"旅游"}</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">}</div>
</div>
</li>
</ol>
<p>通过引用方式 aggregate聚合框架中的 $lookup操作符 来进行关联查询</p>
<p>例如:users集合 和 user_hobby集合 将这两个集合进行关联查询</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// users集合关联user_hobby集合</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.users.aggregate([</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; {</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-attr">$lookup:</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-attr">from: <span class="hljs-string">"user_hobby", <span class="hljs-comment">//目标关联集合</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-attr">localField: <span class="hljs-string">"hobbys", &nbsp; <span class="hljs-comment">//当前集合要关联的字段</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-attr">foreignField: <span class="hljs-string">"hobby_id", &nbsp;<span class="hljs-comment">//目标集合要关联的字段</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-attr">as: <span class="hljs-string">"new_hobby" &nbsp;<span class="hljs-comment">//查询后返回数据存放的字段名(这是动态生成的,在原来的users集合中是不存在的)</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; },</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; {</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; &nbsp; &nbsp; <span class="hljs-comment">// ... 如果还有更多的集合需要关联查询,还可以继续关联查询下去。。。!</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">&nbsp; &nbsp; }</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">])</div>
</div>
</li>
</ol>
<h3>&nbsp;</h3>
<h3>3、什么时候才应该使用引用方式(拆分集合(表)):</h3>
<ul>
<li>当内嵌文档(子文档)太大时,如数量很多 或 占用空间超过16MB时(目前最大限度16MB);</li>
<li>当内嵌文档 或 数组等元素会频繁更新修改时;</li>
<li>当内嵌数组中的元素数量是未知的(后期可以会持续增加,没有封顶)时;</li>
</ul>
<p>&nbsp;</p>
<h3>4、MongoDB 引用是有限制的:&nbsp;</h3>
<ul>
<li>MongoDB 对使用引用的集合之间并无主外键检查;</li>
<li>MongoDB 使用聚合框架的 $lookup 来模仿关联查询;</li>
<li>$lookup 只支持 left outer join</li>
<li>$lookup 的关联目标(from)不能是分片集合(表);</li>
</ul>
<p>数据模型的三层深度:</p>
<p>概念模型,逻辑模型,物理模型</p>
<p>传统数据库模型设计:从概念到逻辑到物理,它们之间其实就是从概念模型 到 物理模型&nbsp;的一个逐步细化的过程!</p>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>项目</td>
<td>概念模型 CDM</td>
<td>逻辑模型 LDM</td>
<td>物理模型 PDM</td>
</tr>
<tr>
<td>目的</td>
<td>描述业务系统要管理的对 象</td>
<td>基于概念模型,详细列出 所有实体、实体的属性及 关系</td>
<td>根据逻辑模型,结合数据库 的物理结构,设计具体的表 结构,字段列表及主外键</td>
</tr>
<tr>
<td>特点</td>
<td>用概念名词来描述现实中 的实体及业务规则,如 “联系人”</td>
<td>基于业务的描述 和数据库无关</td>
<td>技术实现细节 和具体的数据库类型相关</td>
</tr>
<tr>
<td>主要使用者</td>
<td>用户 需求分析师</td>
<td>需求分析师 架构师及开发者</td>
<td>开发者 DBA</td>
</tr>
</tbody>
</table>
</div>
<h3>&nbsp;</h3>
<h3>5、MongoDB 文档模型设计的三个误区 :</h3>
<ol>
<li>不需要模型设计</li>
<li>MongoDB 应该用一个超级大文档来组织所有数据</li>
<li>MongoDB 不支持关联或者事务</li>
</ol>
<p>所以严格来讲,MongoDB 同样需要概念/逻辑建模的,文档模型设计的物理层结构可以和逻辑层类似,可以省略物理建模的具体过程。</p>
<p>关系模型 VS 文档模型:</p>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>项目</td>
<td>关系数据库</td>
<td>JSON 文档模型</td>
</tr>
<tr>
<td>模型设计层次</td>
<td>
<p>概念模型</p>
<p>逻辑模型</p>
<p>物理模型</p>
</td>
<td>
<p>概念模型</p>
<p>逻辑模型</p>
</td>
</tr>
<tr>
<td>模型实体</td>
<td>表</td>
<td>集合</td>
</tr>
<tr>
<td>模型属性</td>
<td>列</td>
<td>字段</td>
</tr>
<tr>
<td>模型关系</td>
<td>关联关系,主外键</td>
<td>内嵌数组,引用字段</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>十二、MongoDB数据的操作:(和关系型数据库一样,就是增、删、查、改)</h1>
<h3><br>&nbsp;1、插入数据:insert()、insertOne()、insertMany()</h3>
<p>语法:</p>
<p>db.&lt;集合&gt;.insertOne(&lt;JSON对象&gt;)</p>
<p>db.&lt;集合&gt;.insertMany([&lt;JSON 1&gt;,&lt;JSON 2&gt;,&lt;JSON 3&gt;,...&lt;JSON n&gt;])</p>
<p>注:插入数据时不需要专门去创建集合(表),因为插入数据时会自动创建集合!!</p>
<ul>
<li>插入数据:这里以student集合【学生表】为例!</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.insert({<span class="hljs-string">"name": <span class="hljs-string">"muguilin", <span class="hljs-string">"age": <span class="hljs-number">28, <span class="hljs-string">"sex": <span class="hljs-string">"男", <span class="hljs-attr">job: <span class="hljs-string">"Web前端"});</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 插入1条数据</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.insertOne({<span class="hljs-string">"name": <span class="hljs-string">"muguilin", <span class="hljs-string">"age": <span class="hljs-number">28, <span class="hljs-string">"sex": <span class="hljs-string">"男", <span class="hljs-attr">job: <span class="hljs-string">"Web前端"});</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 插入多条数据</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.insertMany([</div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">    {<span class="hljs-string">"name": <span class="hljs-string">"zhangsan", <span class="hljs-string">"age": <span class="hljs-number">32, <span class="hljs-string">"sex": <span class="hljs-string">"男", <span class="hljs-attr">job: <span class="hljs-string">"JAVA"},</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">    {<span class="hljs-string">"name": <span class="hljs-string">"lisi", <span class="hljs-string">"age": <span class="hljs-number">28, <span class="hljs-string">"sex": <span class="hljs-string">"女", <span class="hljs-attr">job: <span class="hljs-string">"PHP"},</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">    {<span class="hljs-string">"name": <span class="hljs-string">"wanger", <span class="hljs-string">"age": <span class="hljs-number">16, <span class="hljs-string">"sex": <span class="hljs-string">"男", <span class="hljs-attr">job: <span class="hljs-string">"Web前端"},</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">]);</div>

</div>

</li>

</ol></div>
<p>&nbsp;</p>
<h3>2、查找数据:find()、findOne()</h3>
<p>语法:</p>
<p>db.&lt;集合&gt;.find(&lt;查询条件&gt;)</p>
<p>find()还支持合用 field.sub_field 的形式查询子文档</p>
<ul>
<li>查找数据,如果find()中没有参数,那么将列出这个集合中的所有文档:注:find()返回的是游标</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find()</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">//相当于下面关系数据库中的语法:</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">select * <span class="hljs-selector-tag">from <span class="hljs-selector-tag">student</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 在查询返回的结果后面加上.prettys()方法可以让显示效果更友好!</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find()<span class="hljs-selector-class">.pretty()</span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 查询第一条数据</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.findOne()</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">相当于:<span class="hljs-selector-tag">selecttop <span class="hljs-selector-tag">1 * <span class="hljs-selector-tag">from <span class="hljs-selector-tag">student;</span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">或者是:<span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find()<span class="hljs-selector-class">.limit(<span class="hljs-number">1);</span></span></span></span></span></div>

</div>

</li>

</ol>
<ul>
<li>指定查询返回的字段&nbsp;(例如:查询学生集合(表)中所有的女同学,不显示id,只显示名字 和 年龄&nbsp; &lt;字段名:0不显示,1显示&gt;,或者:&lt;字段名:false不显示,true显示&gt;)</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">db.student.find({sex: <span class="hljs-string">"女"<span class="hljs-string">}, {<span class="hljs-attr">_id: <span class="hljs-number">0, <span class="hljs-attr">name: <span class="hljs-number">1, <span class="hljs-attr">age: <span class="hljs-number">1}<span class="hljs-string">)</span></span></span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">// <span class="hljs-string">相当于:select <span class="hljs-string">name, <span class="hljs-string">age <span class="hljs-string">from <span class="hljs-string">student <span class="hljs-string">where <span class="hljs-string">sex <span class="hljs-string">= <span class="hljs-string">'女'<span class="hljs-string">;</span></span></span></span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">或者:1 <span class="hljs-string">=== <span class="hljs-literal">true<span class="hljs-string">, <span class="hljs-number">0 <span class="hljs-string">=== <span class="hljs-literal">false</span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">db.student.find({sex: <span class="hljs-string">"女"<span class="hljs-string">}, {<span class="hljs-attr">_id: <span class="hljs-literal">false, <span class="hljs-attr">name: <span class="hljs-literal">true, <span class="hljs-attr">age: <span class="hljs-literal">true}<span class="hljs-string">)</span></span></span></span></span></span></span></span></span></span></div>

</div>

</li>

</ol>
<ul>
<li>子文档查询</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-attribute">db.student.find({"score.shuxue": 60 });</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="swift"><span class="hljs-comment">// 子文档查询</span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({<span class="hljs-string">"score": {<span class="hljs-string">"shuxue": <span class="hljs-number">60 }});</span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 多个子文档查询 $elemMatch 表示必须是同一个子对象满足多个条件</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({<span class="hljs-string">"score": {$elemMatch: {<span class="hljs-string">"yuwen": <span class="hljs-number">80, <span class="hljs-string">"shuxue": <span class="hljs-number">60, <span class="hljs-string">"yinyu": <span class="hljs-number">70 });</span></span></span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>

</ol>
<p>条件查询:</p>
<ul>
<li>精确条件查询:</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({<span class="hljs-string">"uid":<span class="hljs-string">"u10010"});</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">或:</div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({<span class="hljs-string">"name":<span class="hljs-string">"沐枫"});</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">// 相当于: <span class="hljs-built_in">select * from student where name = <span class="hljs-string">"沐枫";</span></span></div>

</div>

</li>

</ol></div>
<ul>
<li>模糊条件查询:</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 大于查询</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"score": {<span class="hljs-attr">$gt: <span class="hljs-number">60}})</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">//相当于:select * from student where score &gt; 60;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 小于查询</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"score": {<span class="hljs-attr">$lt: <span class="hljs-number">60}})</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where score &lt; 60;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 大于等于查询</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"score": {<span class="hljs-attr">$gte: <span class="hljs-number">80}})</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where score &gt;= 80;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 小于等于查询</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"score": {<span class="hljs-attr">$lte: <span class="hljs-number">80}})</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where score &lt;= 80;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 正则表达式查询(查找名字中以 “沐” 开头的记录)</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"name": <span class="hljs-regexp">/^沐/g})</span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where name like '沐%';</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 正则表达式查询(查找名字中包含 “沐” 的记录)</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-string">"name": <span class="hljs-regexp">/沐/g})</span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where name like '%沐%';</span></div>

</div>

</li>

</ol>
<ul>
<li>条件查询对照:(MongoDB 与 传统数据库 比对)&nbsp;</li>

</ul>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td rowspan="1" colspan="2">SQL(MySql、SqlServer)</td>
<td rowspan="1" colspan="2">MQL(MongoDB)</td>

</tr>
<tr>
<td>a = 1</td>
<td>等于</td>
<td>{ a : 1}</td>
<td>等于</td>

</tr>
<tr>
<td>a &lt;&gt; 1</td>
<td>不等于</td>
<td>{ a : { $ne : 1 }}</td>
<td>不等于 $ne:不存在 或 存在 但 不等于</td>

</tr>
<tr>
<td>a &gt; 1</td>
<td>大于</td>
<td>{ a : { $gt : 1 }}</td>
<td>大于 $gt:存在 并 大于</td>

</tr>
<tr>
<td>a &gt;= 1</td>
<td>大于等于</td>
<td>{ a : { $gte : 1 }}</td>
<td>大于等于 $gte:存在 并 大于等于</td>

</tr>
<tr>
<td>a &lt; 1</td>
<td>小于</td>
<td>{ a : { $lt : 1 }}</td>
<td>小于 $lt:存在 并 小于</td>

</tr>
<tr>
<td>a &lt;= 1</td>
<td>小于等于</td>
<td>{ a : { $lte : 1 } }</td>
<td>小于等于 $lte:存在 并 小于等于</td>

</tr>

</tbody>

</table>

</div>
<p>&nbsp;</p>
<p>逻辑查询:</p>
<ul>
<li>多条件查询</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 查询 age &gt;= 18 并且 age &lt;= 26 </span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find({<span class="hljs-attr">age: {<span class="hljs-attr">$gte: <span class="hljs-number">18, <span class="hljs-attr">$lte: <span class="hljs-number">26}});</span></span></span></span></span></div>

</div>

</li>

</ol></div>
<ul>
<li>逻辑与:$and</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({<span class="hljs-string">"score": <span class="hljs-number">80, <span class="hljs-string">"age": <span class="hljs-number">18})</span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select * from student where score = 80 and age = 18;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 另一种$and形式</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({$and:[{<span class="hljs-string">"score":<span class="hljs-number">60 , <span class="hljs-string">"age":<span class="hljs-number">12}, {<span class="hljs-string">"score":<span class="hljs-number">80 , <span class="hljs-string">"age":<span class="hljs-number">15}]})</span></span></span></span></span></span></span></span></span></div>

</div>

</li>

</ol></div>
<ul>
<li>逻辑或:$or (只需满足1个条件),查找所有年龄是9岁,或者11岁的学生</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">db.student.find({$or: [{<span class="hljs-attr">"age": <span class="hljs-number">18}, {<span class="hljs-attr">"age": <span class="hljs-number">25}]<span class="hljs-string">})</span></span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">// <span class="hljs-string">相当于:select <span class="hljs-string">* <span class="hljs-string">from <span class="hljs-string">student <span class="hljs-string">where <span class="hljs-string">age <span class="hljs-string">= <span class="hljs-number">18 <span class="hljs-string">or <span class="hljs-string">age <span class="hljs-string">= <span class="hljs-number">25<span class="hljs-string">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>

</div>

</li>

</ol></div>
<ul>
<li>查询逻辑对照:(MongoDB 与 传统数据库 比对)&nbsp;</li>

</ul>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td rowspan="1" colspan="2">SQL(MySql、SqlServer)</td>
<td rowspan="1" colspan="2">MQL(MongoDB)</td>

</tr>
<tr>
<td>a = 1 AND b = 1</td>
<td>并且</td>
<td>{ a : 1,b : 1 }&nbsp; 或者是 { $and : [ { a : 1 }, { b :1 } ] }</td>
<td>并且 $and:匹配所有指定条件</td>

</tr>
<tr>
<td>a =1 OR b = 1</td>
<td>或</td>
<td>{ $or : [ { a : 1 } , { b : 1 } ] }</td>
<td>或 $or:匹配指定的2个 或 多个条件中的1个</td>

</tr>
<tr>
<td>a IS NULL</td>
<td>不存在</td>
<td>{ a : { $exists : false } }</td>
<td>不存在</td>

</tr>
<tr>
<td>a IN (1,2,3)</td>
<td>存在</td>
<td>{ a : { $in: } }</td>
<td>
<p>存在 $in:存在 并 并在指定的数组中</p>
<p>不存在 $nin:不存在 或 不在指定的数组中</p>

</td>

</tr>

</tbody>

</table>

</div>
<p>&nbsp;</p>
<p>聚合查询:</p>
<p>MongoDB聚合框架(Aggregation Framework)是一个计算框架,它可以:</p>
<ol>
<li>可作用在一个 或&nbsp; 几个集合上</li>
<li>对集合中的数据进行一系列的运算</li>
<li>可将数据转化为所期望数据形式,如(数学计算,统计,类型,格式处理等)</li>

</ol>
<p>对效果而言,聚合查询相录于传统SQL查询中的,ORDER BY,GROUP BY,LIMIT,LEFT OUTER JOIN,AS等!</p>
<ul>
<li>聚合查询对照:(MongoDB 与 传统数据库 比对)&nbsp;</li>

</ul>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>步骤</td>
<td>作用</td>
<td>
<p>SQL等价运算符</p>

</td>

</tr>
<tr>
<td>$match</td>
<td>过滤</td>
<td>WhERE</td>

</tr>
<tr>
<td>$project</td>
<td>投影</td>
<td>
<p>AS</p>

</td>

</tr>
<tr>
<td>$sort</td>
<td>排序</td>
<td>ORDER BY</td>

</tr>
<tr>
<td>$group</td>
<td>分组</td>
<td>GROUP BY</td>

</tr>
<tr>
<td>$skip</td>
<td>结果限制</td>
<td>SKIP</td>

</tr>
<tr>
<td>$limit</td>
<td>结果限制</td>
<td>LIMIT</td>

</tr>
<tr>
<td>$lookup</td>
<td>左外连接(多表操作)</td>
<td>LEFT OUTER JOIN</td>

</tr>
<tr>
<td>$graphLookup</td>
<td>图搜索</td>
<td>N/A</td>

</tr>
<tr>
<td>$facet</td>
<td>分面搜索</td>
<td>N/A</td>

</tr>
<tr>
<td>$bucket</td>
<td>分面搜索</td>
<td>N/A</td>

</tr>
<tr>
<td>$unwind</td>
<td>展开数组</td>
<td>N/A</td>

</tr>

</tbody>

</table>

</div>
<p>&nbsp;</p>
<ul>
<li>升降排序查找:(1 升序,&nbsp;-1 降序)</li>

</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 升序</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find().<span class="hljs-built_in">sort({<span class="hljs-string">"age": <span class="hljs-number">1});</span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 降序</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find().<span class="hljs-built_in">sort({<span class="hljs-string">"age": -<span class="hljs-number">1});</span></span></span></span></div>

</div>

</li>

</ol></div>
<ul>
<li>查询前 10&nbsp;条数据</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find()<span class="hljs-selector-class">.limit(<span class="hljs-number">10);</span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:selecttop 10 * from student;</span></div>

</div>

</li>

</ol>
<ul>
<li>查询第 10 条以后的数据</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.find().skip(10);</div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">// 相当于:<span class="hljs-keyword">select * <span class="hljs-keyword">from student <span class="hljs-keyword">where <span class="hljs-keyword">id <span class="hljs-keyword">not <span class="hljs-keyword">in (selecttop <span class="hljs-number">10 * <span class="hljs-keyword">from student);</span></span></span></span></span></span></span></span></div>

</div>

</li>

</ol>
<ul>
<li>查询&nbsp;10 到 20 之间的数据(这就是项目中常见的列表分页查询)</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find()<span class="hljs-selector-class">.limit(20)<span class="hljs-selector-class">.skip(10);</span></span></span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">/*</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">* 列表分页</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">* limit:就是 pageSize</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">* skip :就是第几页 * pageSize</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">*/</span></div>

</div>

</li>

</ol>
<ul>
<li>查询某个结果集的记录条数(统计数量)</li>

</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find({age: {$gte: <span class="hljs-number">18}}).<span class="hljs-built_in">count();</span></span></span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 相当于:select count(*) from student where age &gt;= 18;</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 如果要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)</span></div>

</div>

</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-built_in">find().limit(<span class="hljs-number">20).skip(<span class="hljs-number">10).<span class="hljs-built_in">count(<span class="hljs-literal">true);</span></span></span></span></span></div>

</div>

</li>

</ol>
<ul>
<li>展开数据查询:查询某个学生各个学科的成绩</li>

</ul>
<pre><code class="hljs css"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.aggregate(<span class="hljs-selector-attr">[{$unwind: <span class="hljs-string">'$score'}])</span></span></span></span></span></code></pre>
<ul>
<li>查询结果限制: 例如:查询学生集合(表)中的所有女生的姓名和年龄!</li>
</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.aggregate([</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{$<span class="hljs-attribute">match: <span class="hljs-string">"sex": <span class="hljs-string">"女"}, <span class="hljs-comment">// 只取性别为女性的</span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{$<span class="hljs-attribute">skip: <span class="hljs-number">100}, <span class="hljs-comment">// 跳过100条</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{$<span class="hljs-attribute">limit: <span class="hljs-number">30}, <span class="hljs-comment">// 只取30条</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 只返回姓名 和 年龄这两个字段</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">{$<span class="hljs-attribute">project: {</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">'姓名': <span class="hljs-string">'name',</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-string">'年龄': <span class="hljs-string">'age'</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">}}</div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">])</div>
</div>
</li>
</ol>
<p>explain查询:</p>
<p>explain 是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用 该方法,就可以得到查询细节。explain 会返回一个文档,而不是游标本身。</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 查询时加上explain() 方法会返回查询使用的索引情况,耗时和扫描文档数的统计信息</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find({<span class="hljs-attribute">name:<span class="hljs-string">"沐枫"})<span class="hljs-selector-class">.explain()</span></span></span></span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 在explain() 方法中加上"executionStats"参数 可看查 查询具体的执行时间</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.find({<span class="hljs-attribute">name:<span class="hljs-string">"沐枫"})<span class="hljs-selector-class">.explain(<span class="hljs-string">"executionStats")</span></span></span></span></span></span></span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3><br>3、修改数据:update()</h3>
<p>语法:</p>
<p>db.&lt;集合&gt;.update(&lt;查询条件&gt;,&lt;更新字段&gt;)</p>
<p>db.&lt;集合&gt;.updateOne(&lt;查询条件&gt;,&lt;更新字段&gt;) 表示无论条件匹配多少记录,始终只更新第1条记录</p>
<p>db.&lt;集合&gt;.updateMany([&lt;查询条件&gt;,&lt;更新字段&gt;]) 表示 条件匹配多少条 就 更新多少条</p>
<p>注:在修改(更新)时,如果要更新的字段名存在 则更新数据,如果不存在 则创建并写入数据!!</p>
<p>注:update(),updateOne(),updateMany() 方法要求更新条件部分必须具有以下参数之一,否则就报错!!&nbsp;</p>
<div class="table-box">
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>参数</td>
<td>说明</td>

</tr>
<tr>
<td>$set</td>
<td>增加</td>

</tr>
<tr>
<td>$unset</td>
<td>删除</td>

</tr>
<tr>
<td>$push</td>
<td>增加一个对象到数组底部</td>

</tr>
<tr>
<td>$pushAll</td>
<td>增加多个对象到数组底部</td>

</tr>
<tr>
<td>
<p>$pop</p>

</td>
<td>从数组底部删除一个对象</td>

</tr>
<tr>
<td>$pull</td>
<td>如果匹配到指定的值,从数组中删除相应的对象</td>

</tr>
<tr>
<td>$pullAll</td>
<td>如果匹配任意值,从数组中删除相应的对象</td>

</tr>
<tr>
<td>$addToSet</td>
<td>如果不存在就增加一个值到数组</td>

</tr>

</tbody>

</table>

</div>
<p>&nbsp;</p>
<ul>
<li>修改名字叫做小明的,把年龄更改为16岁:</li>

</ul>
<div>
<pre name="code" class="has"><code class="hljs ruby">db.student.update({<span class="hljs-string">"name"<span class="hljs-symbol">:<span class="hljs-string">"小明"},{$set<span class="hljs-symbol">:{<span class="hljs-string">"age"<span class="hljs-symbol">:<span class="hljs-number">16}});</span></span></span></span></span></span></span></code></pre>
</div>
<ul>
<li>查找数学成绩是70,把年龄更改为33岁:</li>
</ul>
<div>
<pre name="code" class="has"><code class="hljs apache"><span class="hljs-attribute">db.student.update({<span class="hljs-string">"score.shuxue":<span class="hljs-number">70},{$set:{<span class="hljs-string">"age":<span class="hljs-number">33}});</span></span></span></span></span></code></pre>
</div>
<ul>
<li>更改所有匹配项【默认情况下,update()方法是更新单个文档。 要更新多个文档,请使用开启update()方法中的multi选项】</li>
</ul>
<div>
<pre name="code" class="has"><code class="hljs groovy">db.student.update({<span class="hljs-string">"sex":<span class="hljs-string">"男"},{<span class="hljs-attr">$set:{<span class="hljs-string">"age":<span class="hljs-number">33}},{<span class="hljs-attr">multi: <span class="hljs-literal">true});</span></span></span></span></span></span></span></code></pre>
</div>
<ul>
<li>完整替换,不出现$set关键字了:</li>
</ul>
<div>
<pre name="code" class="has"><code class="hljs apache"><span class="hljs-attribute">db.student.update({<span class="hljs-string">"name":<span class="hljs-string">"小明"},{<span class="hljs-string">"name":<span class="hljs-string">"大明",<span class="hljs-string">"age":<span class="hljs-number">16});</span></span></span></span></span></span></span></code></pre>
</div>
<p>&nbsp;</p>
<h3>4、删除数据:remove()&nbsp;</h3>
<p>语法:</p>
<p>db.&lt;集合&gt;.remove(&lt;查询条件&gt;)</p>
<p>注:remove() 命令需要配合查询条件使用,只要匹配到的文档就会被删除!!</p>
<ul>
<li>删除实例:</li>
</ul>
<div><ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 指定删除 名字等于 小明的记录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-keyword">remove({<span class="hljs-string">"name":<span class="hljs-string">"小明"})</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 删除 数学成绩 小于 60 以下的记录</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-keyword">remove({<span class="hljs-string">"score.shuxue": {$lt: <span class="hljs-number">60 })</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 删除 student集合中所有的记录!!!</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-keyword">remove({})</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 语法错误</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.<span class="hljs-keyword">remove()</span></div>
</div>
</li>
</ol></div>
<ul>
<li>默认情况下,remove()方法将删除所有符合删除条件的文档。 使用开启justOne选项将删除操作限制为仅匹配文档之一。</li>
</ul>
<div>
<pre name="code" class="has"><code class="hljs groovy">db.student.remove({<span class="hljs-string">"name":<span class="hljs-string">"小明"}, {<span class="hljs-attr">justOne: <span class="hljs-literal">true});</span></span></span></span></code></pre>
</div>
<p>&nbsp;</p>
<h3>5、删除集合:drop()</h3>
<p>语法:</p>
<p>db.&lt;集合&gt;.drop()</p>
<p>注:删除后集合中的所以文档、以及相关的索引等都会被删除!!</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 删除学生集合(删除学生表)</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.drop()</span></span></span></div>
</div>
</li>
</ol>
<p>&nbsp;</p>
<h3>6、索引:</h3>
<p>索引是对数据库集合(表)中一列 或 多列的数据进行排序的一种结构,它可以让我们查询数据库变得更快(尤其是在数据量大的情况下)。</p>
<p>注意:</p>
<p>随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort, MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以 致无法在内存中进行排序,此时 MongoDB 将会报错。</p>
<ul>
<li>创建索引&nbsp;(1 升序,&nbsp;-1 降序)</li>
</ul>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.ensureIndex({<span class="hljs-string">"name":<span class="hljs-number">1})</span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">&nbsp;</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-comment">// 创建索引 并 指定索引名称</span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">&nbsp;</div>
<div class="hljs-ln-code">
<div class="hljs-ln-line">db.student.ensureIndex({<span class="hljs-string">"name":<span class="hljs-number">1},{<span class="hljs-string">"name":<span class="hljs-string">"studentIndex"}) </span></span></span></span></div>
</div>
</li>
</ol>
<ul>
<li>查看当前集合索引</li>
</ul>
<pre><code class="hljs css"><span class="hljs-selector-tag">db<span class="hljs-selector-class">.student<span class="hljs-selector-class">.getIndexes()</span></span></span></code></pre>
<ul>
<li>删除索引</li>
</ul>
<pre><code class="hljs apache"><span class="hljs-attribute">db.student.dropIndex({<span class="hljs-string">"name":<span class="hljs-number">1})</span></span></span></code></pre>
<ul>
<li>唯一索引(值不能重复,保证维一性,一般用xxxID)</li>
</ul>
<pre><code class="hljs ruby">db.student.ensureIndex({<span class="hljs-string">"sid"<span class="hljs-symbol">:<span class="hljs-number">1},{<span class="hljs-string">"unique"<span class="hljs-symbol">:true})</span></span></span></span></span></code></pre>
<ul>
<li>复合索引(多个索引列)</li>
</ul>
<pre><code class="hljs apache"><span class="hljs-attribute">db.student.ensureIndex({<span class="hljs-string">"name":<span class="hljs-number">1, <span class="hljs-string">"age":-<span class="hljs-number">1})</span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>十三、在Node.js中使用MongoDB数据库</h1>
<p>Node.js 和 MongoDB 可以说是黄金搭配,再加上它们各自都有比较成熟的官方提供的 和 第三方提供相关框架,可以在各种复杂项目场景中使用啦!!</p>
<h3>1、Node.js框架:</h3>
<p>Express&nbsp;:快速,简单,极简的Node.js&nbsp;Web框架</p>
<p>Koa&nbsp;:基于Node.js&nbsp;平台的下一代 web 开发框架(由 Express 幕后的原班人马打造)</p>
<p>Egg&nbsp;:为建造而生Node.js&nbsp;和Koa更好的企业框架和应用程序为企业级框架和应用而生</p>
<p>&nbsp;</p>
<h3>2、MongbDB驱动:</h3>
<p>MongoDB Node.JS Driver&nbsp;:适用于MongoDB的下一代Node.js&nbsp;驱动程序</p>
<p>Mongoose&nbsp;:适用于Node.js的优雅MongoDB对象建模</p><br><br>
来源:https://www.cnblogs.com/cxxtreasure/p/14194981.html
頁: [1]
查看完整版本: MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门