爱上你好超模 發表於 2019-4-29 18:17:00

MongoDB面试题

<h3>1.什么是MongoDB</h3>
<div class="cnblogs_code">
<pre>MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。<br>BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.<br>相对于json多了date类型和二进制数组。</pre>
</div>
<p>&nbsp;</p>
<h3>2.MongoDB的优势有哪些</h3>
<ul>
<li>面向文档的存储:以 JSON 格式的文档保存数据。</li>
<li>任何属性都可以建立索引。</li>
<li>复制以及高可扩展性。</li>
<li>自动分片。</li>
<li>丰富的查询功能。</li>
<li>快速的即时更新。</li>
</ul>
<p>&nbsp;</p>
<h3>3 什么是数据库</h3>
<div class="cnblogs_code">
<pre>  数据库可以看成是一个电子化的文件柜,用户可以对文件中的数据运行新增、检索、更新、删除等操作。数据库是一个<br>所有集合的容器,在文件系统中每一个数据库都有一个相关的物理文件。</pre>
</div>
<p>&nbsp;</p>
<h3>4.什么是集合(表)</h3>
<div class="cnblogs_code">
<pre>    集合就是一组 MongoDB 文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。<br>一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。</pre>
</div>
<p>&nbsp;</p>
<h3>5&nbsp;什么是文档(记录)</h3>
<div class="cnblogs_code">
<pre>  文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型<br>数据库中table中的每一条记录相当于MongoDB中的一个文</pre>
</div>
<p>&nbsp;</p>
<h3>6 MongoDB和关系型数据库术语对比图</h3>
<p><img src="https://img2018.cnblogs.com/blog/1521877/201904/1521877-20190429170250020-1693717595.png" alt=""></p>
<p>&nbsp;</p>
<h3>7.什么是非关系型数据库</h3>
<div class="cnblogs_code">
<pre>  非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。</pre>
</div>
<p>&nbsp;</p>
<h3>8&nbsp;为什么用MOngoDB?</h3>
<ul>
<li>架构简单</li>
<li>没有复杂的连接</li>
<li>深度查询能力,MongoDB支持动态查询。</li>
<li>容易调试</li>
<li>容易扩展</li>
<li>不需要转化/映射应用对象到数据库对象</li>
<li>使用内部内存作为存储工作区,以便更快的存取数据。</li>
</ul>
<p>&nbsp;</p>
<h3>9&nbsp;在哪些场景使用MongoDB</h3>
<ul>
<li>大数据</li>
<li>内容管理系统</li>
<li>移动端Apps</li>
<li>数据管理</li>
</ul>
<h3>&nbsp;10 MongoDB中的命名空间是什么意思?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mongodb存储bson对象在丛集(collection)中.数据库名字和丛集名字以句点连结起来叫做名字空间(namespace).

  一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的<br>第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个<br>头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间,document之间通过<br>双向链表连接。

索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。</span></pre>
</div>
<p>&nbsp;</p>
<h3>11 monogodb 中的分片什么意思</h3>
<div class="cnblogs_code">
<pre>  分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长<br>时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加<br>以及读写操作的要求。</pre>
</div>
<p>&nbsp;</p>
<h3>12 为什么要在MongoDB中使用分析器</h3>
<div class="cnblogs_code">
<pre>  mongodb中包括了一个可以显示数据库中每个操作性能特点的数据库分析器.通过这个分析器你可以找到比预期慢<br>的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引.</pre>
</div>
<p>&nbsp;</p>
<h3>13&nbsp;.MongoDB支持主键外键关系吗</h3>
<div class="cnblogs_code">
<pre>  默认MongoDB不支持主键和外键关系。 用Mongodb本身的API需要硬编码才能实现外键关联,不够直观且难度<br>较大</pre>
</div>
<p>&nbsp;</p>
<h3>&nbsp;14&nbsp;MongoDB支持哪些数据类型</h3>
<ul>
<ul>
<li>String</li>
<li>Integer</li>
<li>Double</li>
<li>Boolean</li>
<li>Object</li>
<li>Object ID</li>
<li>Arrays</li>
<li>Min/Max Keys</li>
<li>Datetime</li>
<li>Code</li>
<li>Regular Expression等</li>
</ul>
</ul>
<p>&nbsp;</p>
<h3>15&nbsp;为什么要在MongoDB中用"Code"数据类型</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Code</span><span style="color: rgba(128, 0, 0, 1)">"</span>类型用于在文档中存储 JavaScript 代码。</pre>
</div>
<p>&nbsp;</p>
<h3>16&nbsp;为什么要在MongoDB中用"Regular Expression"数据类型</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Regular Expression</span><span style="color: rgba(128, 0, 0, 1)">"</span>类型用于在文档中存储正则表达式</pre>
</div>
<p>&nbsp;</p>
<h3>17&nbsp;为什么在MongoDB中使用"Object ID"数据类型</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ObjectID</span><span style="color: rgba(128, 0, 0, 1)">"</span>数据类型用于存储文档id</pre>
</div>
<p>&nbsp;</p>
<h3>18"ObjectID"有哪些部分组成</h3>
<div class="cnblogs_code">
<pre>一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器</pre>
</div>
<p>&nbsp;</p>
<h3>19&nbsp;在MongoDb中什么是索引</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">    索引用于高效的执行查询,没有索引的MongoDB将扫描整个集合中的所有文档,这种扫描效率很低,需要处理大量<br>的数据.
    索引是一种特殊的数据结构,将一小块数据集合保存为容易遍历的形式.索引能够存储某种特殊字段或字段集的<br>值,并按照索引指定的方式将字段值进行排序.</span></pre>
</div>
<p>&nbsp;</p>
<h3>20 如何添加索引</h3>
<div class="cnblogs_code">
<pre>使用db.collection.createIndex()在集合中创建一个索引</pre>
</div>
<p>&nbsp;</p>
<h3>21.如何查询集合中的文档</h3>
<div class="cnblogs_code">
<pre>db.collectionName.find({key:value})</pre>
</div>
<p>&nbsp;</p>
<h3>22用什么方法可以格式化输出结果</h3>
<div class="cnblogs_code">
<pre>db.collectionName.find().pretty()</pre>
</div>
<p>&nbsp;</p>
<h3>23&nbsp;如何使用"AND"或"OR"条件循环查询集合中的文档</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()</span></pre>
</div>
<p>&nbsp;</p>
<h3>24 更新数据</h3>
<div class="cnblogs_code">
<pre>db.collectionName.update({key:value},{$<span style="color: rgba(0, 0, 255, 1)">set</span>:{newkey:newValue}})</pre>
</div>
<p>&nbsp;</p>
<h3>25&nbsp;如何删除文档</h3>
<div class="cnblogs_code">
<pre>db.collectionName.remove({key:value})</pre>
</div>
<p>&nbsp;</p>
<h3>26&nbsp;在MongoDB中如何排序</h3>
<p>并使用 1 和 -1 来指定排序方式,其中 1 表示升序,而 -1 表示降序。</p>
<div class="cnblogs_code">
<pre>db.connectionName.find({key:value}).sort({columnName:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<p>&nbsp;</p>
<h3>27&nbsp;什么是聚合</h3>
<p>  聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。对于 MongoDB 中的聚合操作,应该使用<code>aggregate()</code>方法。</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)</pre>
</div>
<p>&nbsp;</p>
<h3>28&nbsp;在MongoDB中什么是副本集(避免单点故障)</h3>
<div class="cnblogs_code">
<pre>    在MongoDB中副本集由一组MongoDB实例组成,包括一个主节点多个次节点,MongoDB客户端的所有数据都<br>写入主节点(Primary),副节点从主节点同步写入数据,以保持所有复制集内存储相同的数据,提高数据可用性。</pre>
</div>
<p>&nbsp;</p>
<h3>29&nbsp;什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?</h3>
<div class="cnblogs_code">
<pre> NoSQL是非关系型数据库,NoSQL =<span style="color: rgba(0, 0, 0, 1)"> Not Only SQL。<br>关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化</span>/<span style="color: rgba(0, 0, 0, 1)">半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑<br>使用NoSQL数据库。

在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。</span></pre>
</div>
<p>&nbsp;</p>
<h3>30&nbsp;MongoDB支持存储过程吗?如果支持的话,怎么用?</h3>
<div class="cnblogs_code">
<pre>MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。</pre>
</div>
<p>&nbsp;</p>
<h3>31如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?</h3>
<p>  GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。</p>
<p>&nbsp;</p>
<h3>32&nbsp;为什么MongoDB的数据文件很大?</h3>
<p>  MongoDB采用的预分配空间的方式来防止文件碎片。</p>
<p>&nbsp;</p>
<h3>33&nbsp;当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?</h3>
<p>  更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。</p>
<p>&nbsp;</p>
<h3>34&nbsp;MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?</h3>
<p>  不会,只会在A:{B,C}上使用索引。</p>
<p>&nbsp;</p>
<h3>35&nbsp;mongodb成为最好nosql数据库的原因是什么?</h3>
<p>  面向文件的 高性能 高可用性 易扩展性 丰富的查询语言</p>
<p>&nbsp;</p>
<h3>36&nbsp;如果用户移除对象的属性,该属性是否从存储层中删除?</h3>
<p>  是的,用户移除属性然后对象会重新保存(re-save()).</p>
<p>&nbsp;</p>
<h3>37&nbsp;允许空值null吗?</h3>
<p>  对于对象成员而言,是的.然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象.然而用户能够添加空对象{}.</p>
<p>&nbsp;</p>
<h3>38&nbsp;更新操作立刻fsync到磁盘?</h3>
<p>  不会,磁盘写操作默认是延迟执行的.写操作可能在两三秒(默认在60秒内)后到达磁盘.例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次.</p>
<p>&nbsp;</p>
<h3>39&nbsp;如何执行事务/加锁?</h3>
<p>  mongodb没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能.可以把它类比成mysql mylsam的自动提交模式.通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里.</p>
<p>&nbsp;</p>
<h3>40&nbsp;&nbsp;启用备份故障恢复需要多久?</h3>
<p>  从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间.这期间在主数据库上的操作将会失败–包括写入和强一致性读取(strong consistent read)操作.然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveok模式下),即使在这段时间里.</p>
<p>&nbsp;</p>
<h3>41&nbsp;&nbsp;什么是master或primary?</h3>
<p>  它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员.在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary.</p>
<p>&nbsp;</p>
<h3>42&nbsp;&nbsp;我应该启动一个集群分片(sharded)还是一个非集群分片的 mongodb 环境?</h3>
<p>  (数据量大用集群分片,数据量小用非集群)</p>
<p>  为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个 mongodb 环境,除非一台服务器不足以存放你的初始数据集.从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding).</p>
<p>&nbsp;</p>
<h3>43&nbsp;分片(sharding)和复制(replication)是怎样工作的?</h3>
<p>  每一个分片(shard)是一个分区数据的逻辑集合.分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群.</p>
<p>&nbsp;</p>
<h3>44数据在什么时候才会扩展到多个分片(shard)里?</h3>
<p>  mongodb 分片是基于区域(range)的.所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中.只有当存在多余一个块的时候,才会有多个分片获取数据的选项.现在,每个默认块的大小是 64mb,所以你需要至少 64 mb 空间才可以实施一个迁移.</p>
<p>&nbsp;</p>
<h3>45&nbsp;当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?</h3>
<p>  更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上.</p>
<p>&nbsp;</p>
<h3>46&nbsp;如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?</h3>
<p>  如果一个分片(shard)停止了,除非查询设置了“partial”选项,否则查询会返回一个错误.如果一个分片(shard)响应很慢,mongodb则会等待它的响应.</p>
<p>&nbsp;</p>
<h3>47&nbsp;可以把movechunk目录里的旧文件删除吗?</h3>
<p>  没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件.一旦这些操作已经完成,相关的临时文件也应该被删除掉.但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间.</p>
<p>&nbsp;</p>
<h3>48&nbsp;如果块移动操作(movechunk)失败了,我需要手动清除部分转移的文档吗?</h3>
<p>&nbsp;  不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard).</p>
<p>&nbsp;</p>
<h3>49 mongodb是否支持事务</h3>
<p>  MongoDB 4.0的新特性——事务(Transactions):MongoDB 是不支持事务的,因此开发者在需要用到事务的时候,不得不借用其他工具,在业务代码层面去弥补数据库的不足。</p>
<p>  事务和会话(Sessions)关联,一个会话同一时刻只能开启一个事务操作,当一个会话断开,这个会话中的事务也会结束。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/angle6-liu/p/10791875.html
頁: [1]
查看完整版本: MongoDB面试题