最全面试题,精心整理100家互联网企业面经,祝你面试成功。面试必过(2023优化版)已发布在个人微信公众号【面向Offer学编程】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注。
文章目录
- 你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?
- MongoDB`的优势有哪些?
- 什么是集合`Collection`、文档`Document`,以及与关系型数据库术语类比。
- MongoDB是什么?
- MongoDB有哪些特点?
- NoSQL数据库有哪些类型?
- MySQL与MongoDB之间最基本的差别是什么?
- 你怎么比较MongoDB、CouchDB及CouchBase?
- MongoDB成为最好NoSQL数据库的原因是什么?
- journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?
- 问`mongodb`和`redis`区别以及选择原因
- 分析器在MongoDB中的作用是什么?
- 名字空间(namespace)是什么?
- 如何执行事务/加锁?
- 如果用户移除对象的属性,该属性是否从存储层中删除?
- 能否使用日志特征进行安全备份?
- 什么是”`Mongod`“,以及`MongoDB`命令。
- 允许空值null吗?
- 更新操作立刻fsync到磁盘?
- 如何执行事务/加锁?
- 为什么我的数据文件如此庞大?
- 启用备份故障恢复需要多久?
- 什么是master或primary?
- 什么是`Arbiter`?
- 什么是secondary或slave?
- 我必须调用getLastError来确保写操作生效了么?
- 我应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境?
- 分片(sharding)和复制(replication)是怎样工作的?
- 数据在什么时候才会扩展到多个分片(shard)里?
- 当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?
- 如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?
- 我可以把moveChunk目录里的旧文件删除吗?
- 我怎么查看 Mongo 正在使用的链接?
- 如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?
- 如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?
- 当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
- MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
- 如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
- MongoDB支持存储过程吗?如果支持的话,怎么用?
- 如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?
- 什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?
- 如果块移动操作(`moveChunk`)失败了,我需要手动清除部分转移的文档吗?
- 分片(`Shard`)和复制(`replication`)是怎样工作的?
- `raft`选举过程,投票规则?
- MongoDB支持存储过程吗?如果支持的话,怎么用?
- 如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?
- 为什么MongoDB的数据文件很大?
- 复制集节点类型有哪些?
- 当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
- MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
- 如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
- 分析器在MongoDB中的作用是什么?
- 如果用户移除对象的属性,该属性是否从存储层中删除?
- 能否使用日志特征进行安全备份?
- 更新操作立刻fsync到磁盘?
- 如何执行事务/加锁?
- 什么是master或primary?
- getLastError的作用
- 分片(sharding)和复制(replication)是怎样工作的?
- 数据在什么时候才会扩展到多个分片(shard)里?
- 当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?
- 我怎么查看Mongo正在使用的链接?
- mongodb的结构介绍
- 数据库的整体结构
- MongoDB是由哪种语言写的?
- MongoDB的优势有哪些?
- 什么是集合?
- 什么是文档?
- 什么是”mongod“ ?
- "mongod"参数有什么?
- 什么是"mongo"
- MongoDB哪个命令可以切换数据库?
- 什么是非关系型数据库?
- 非关系型数据库有哪些类型?
- 为什么用MOngoDB?
- 在哪些场景使用MongoDB?
- MongoDB中的命名空间是什么意思?
- 哪些语言支持MongoDB?
- 在MongoDB中如何创建一个新的数据库?
- 在MongoDB中如何查看数据库列表
- MongoDB中的分片是什么意思?
- 如何查看使用MongoDB的连接Sharding-MongoDB Manual21.如何查看使用MongoDB的连接?
- 什么是复制?
- 在MongoDB中如何在集合中插入一个文档
- 在MongoDB中如何除去一个数据库Collection Methods24.在MongoDB中如何除去一个数据库?
- 在MongoDB中如何创建一个集合?
- 在MongoDB中如何查看一个已经创建的集合?
- 在MongoDB中如何删除一个集合?
- 为什么要在MongoDB中使用分析器?
- MongoDB支持主键外键关系吗?
- MongoDB支持哪些数据类型?
- 为什么要在MongoDB中用"Code"数据类型?
- 为什么要在MongoDB中用"Regular Expression"数据类型?
- 为什么在MongoDB中使用"Object ID"数据类型?
- 如何在集合中插入一个文档?
- "ObjectID"有哪些部分组成?
- 在MongoDb中什么是索引
- 如何添加索引?
- 用什么方法可以格式化输出结果?
- 如何使用"AND"或"OR"条件循环查询集合中的文档?
- 在MongoDB中如何更新数据?
- 如何删除文档?
- `monogodb` 中的分片`sharding`
- 在MongoDB中如何排序?
- 什么是聚合?
- 在MongoDB中什么是副本集?
你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
MongoDB`的优势有哪些?
面向集合(Collection
)和文档(document
)的存储,以JSON格式的文档保存数据。
高性能,支持Document
中嵌入Document
减少了数据库系统上的I/O操作以及具有完整的索引支持,支持快速查询
高效的传统存储方式:支持二进制数据及大型对象
高可用性,数据复制集,MongoDB 数据库支持服务器之间的数据复制来提供自动故障转移(automatic failover
)
高可扩展性,分片(sharding
)将数据分布在多个数据中心,MongoDB支持基于分片键创建数据区域.
丰富的查询功能, 聚合管道(Aggregation Pipeline
)、全文搜索(Text Search
)以及地理空间查询(Geospatial Queries
)
支持多个存储引擎,WiredTiger存储引、In-Memory存储引擎
什么是集合Collection
、文档Document
,以及与关系型数据库术语类比。
- 集合
Collection
位于单独的一个数据库MongoDB 文档Document
集合,它类似关系型数据库(RDBMS)中的表Table
。一个集合Collection
内的多个文档Document
可以有多个不同的字段。通常情况下,集合Collection
中的文档Document
有着相同含义。 - 文档
Document
由key-value构成。文档Document
是动态模式,这说明同一集合里的文档不需要有相同的字段和结构。类似于关系型数据库中table中的每一条记录。 - 与关系型数据库术语类比
mongodb | 关系型数据库 |
---|---|
Database | Database |
Collection | Table |
Document | Record/Row |
Filed | Column |
Embedded Documents | Table join |
MongoDB是什么?
MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。 MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
MongoDB有哪些特点?
1.MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。
2.你可以在MongoDB记录中设置任何属性的索引 (如: FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
3.你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
4.如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
5.Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
6.MongoDb使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。 7.Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
8.Map和Reduce。 Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
9.Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
10.GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
11.MongoDB允许在服务端执行脚本, 可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
NoSQL数据库有哪些类型?
java类似数据类型:
类型 | 解析 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位 |
Double | 双精度浮点值。用于存储浮点值 |
Boolean | 布尔值。用于存储布尔值(真/假) |
Arrays | 用于将数组或列表或多个值存储为一个键 |
Datetime | 记录文档修改或添加的具体时间 |
MongoDB特有数据类型:
类型 | 解析 |
---|---|
ObjectId | 用于存储文档 id ,ObjectId 是基于分布式主键的实现MongoDB 分片也可继续使用 |
Min/Max Keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比 |
Code | 用于在文档中存储 JavaScript 代码 |
Regular Expression | 用于在文档中存储正则表达式 |
Binary Data | 二进制数据。用于存储二进制数据 |
Null | 用于创建空值 |
Object | 用于内嵌文档 |
MySQL与MongoDB之间最基本的差别是什么?
形式 | MongoDB | MySQL |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | |
查询语句 | 独特的MongoDB查询方式 | 传统SQL语句 |
架构特点 | 副本集以及分片 | 常见单点、M-S、MHA、MMM等架构方式 |
数据处理方式 | 基于内存,将热数据存在物理内存中,从而达到高速读写 | 不同的引擎拥有自己的特点 |
使用场景 | 事件的记录,内容管理或者博客平台等数据大且非结构化数据的场景 | 适用于数据量少且很多结构化数据 |
你怎么比较MongoDB、CouchDB及CouchBase?
MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。 除了都以文档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有很多不同。
细节可以参见下面的链接:
MongDB vs CouchDB
CouchDB vs CouchBase
MongoDB成为最好NoSQL数据库的原因是什么?
以下特点使得MongoDB成为最好的NoSQL数据库:
- 面向文件的
- 高性能
- 高可用性
- 易扩展性
- 丰富的查询语言
6.32位系统上有什么细微差别?
journaling会激活额外的内存映射文件。这将进一步抑制32位版本上的数据库大小。因此,现在journaling在32位系统上默认是禁用的。
journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?
每个journal (group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。
问mongodb
和redis
区别以及选择原因
形式 | MongoDB | redis |
---|---|---|
内存管理机制 | MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘 | Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据 |
支持的数据结构 | MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引 | Redis 支持的数据结构丰富,包括hash、set、list等 |
性能 | mongodb依赖内存,TPS较高 | Redis依赖内存,TPS非常高。性能上Redis优于MongoDB |
可靠性 | 支持持久化以及复制集增加可靠性 | Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能 |
数据分析 | mongodb内置数据分析功能(mapreduce) | Redis不支持 |
事务支持情况 | 只支持单文档事务,需要复杂事务支持的场景暂时不适合 | Redis 事务支持比较弱,只能保证事务中的每个操作连续执行 |
集群 | MongoDB 集群技术比较成熟 | Redis从3.0开始支持集群 |
选择原因:
- 架构简单
- 没有复杂的连接
- 深度查询能力,
MongoDB
支持动态查询。 - 容易调试
- 容易扩展
- 不需要转化/映射应用对象到数据库对象
- 使用内部内存作为存储工作区,以便更快的存取数据。
分析器在MongoDB中的作用是什么?
MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。
名字空间(namespace)是什么?
MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。
如何执行事务/加锁?
mongodb
没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能.可以把它类比成mysql mylsam
的自动提交模式.通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里.聚合
如果用户移除对象的属性,该属性是否从存储层中删除?
是的,用户移除属性然后对象会重新保存(re-save())。
能否使用日志特征进行安全备份?
是的。
什么是”Mongod
“,以及MongoDB
命令。
mongod
是处理MongoDB
系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod
命令意味着正在启动MongoDB
进程,并且在后台运行。
MongoDB
命令:
命令 | 说明 |
---|---|
use database_name | 切换数据库 |
db.myCollection.find().pretty() | 格式化打印结果 |
db.getCollection(collectionName).find() | 修改Collection名称 |
允许空值null吗?
对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象。然而用户能够添加空对象{}。
更新操作立刻fsync到磁盘?
不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和经过getLastError_old是有效的)(译者:也许是坑人的面试题??)。
如何执行事务/加锁?
MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。
为什么我的数据文件如此庞大?
MongoDB会积极的预分配预留空间来防止文件系统碎片。
启用备份故障恢复需要多久?
从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败–包括写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间里。
什么是master或primary?
它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。
什么是Arbiter
?
仲裁节点不维护数据集。 仲裁节点的目的是通过响应其他副本集节点的心跳和选举请求来维护副本集中的仲裁
什么是secondary或slave?
Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。
我必须调用getLastError来确保写操作生效了么?
不用。不管你有没有调用getLastError(又叫"Safe Mode")服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。
我应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境?
为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个 MongoDB 环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。
分片(sharding)和复制(replication)是怎样工作的?
每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。
数据在什么时候才会扩展到多个分片(shard)里?
MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是 64Mb,所以你需要至少 64 Mb 空间才可以实施一个迁移。
当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?
更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上。
如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?
如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。
我可以把moveChunk目录里的旧文件删除吗?
没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件。一旦这些操作已经完成,相关的临时文件也应该被删除掉。但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间。
我怎么查看 Mongo 正在使用的链接?
db._adminCommand(“connPoolStats”);
如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?
不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。
如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?
可以。
当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
不会,只会在A:{B,C}上使用索引。
如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。
MongoDB支持存储过程吗?如果支持的话,怎么用?
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。
什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?
答:
NoSQL是非关系型数据库,NoSQL=Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
如果块移动操作(moveChunk
)失败了,我需要手动清除部分转移的文档吗?
不需要,移动操作是一致(consistent
)并且是确定性的(deterministic
)。
- 一次失败后,移动操作会不断重试。
- 当完成后,数据只会出现在新的分片里(shard)
分片(Shard
)和复制(replication
)是怎样工作的?
每一个分片(shard
)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard
)使用集群。
raft
选举过程,投票规则?
当系统启动好之后,初始选举后系统由1个Leader
和若干个Follower
角色组成。然后突然由于某个异常原因,Leader
服务出现了异常,导致Follower
角色检测到和Leader
的上次RPC更新时间超过给定阈值时间时。此时Followe
r会认为Leader
服务已出现异常,然后它将会发起一次新的Leader
选举行为,同时将自身的状态从Follower
切换为Candidate
身份。随后请求其它Follower
投票选择自己。
投票规则:
- 当一个候选人获得了同一个任期号内的大多数选票,就成为领导人。
- 每个节点最多在一个任期内投出一张选票。并且按照先来先服务的原则。
- 一旦候选人赢得选举,立刻成为领导,并发送心跳维持权威,同时阻止新领导人的诞生
MongoDB支持存储过程吗?如果支持的话,怎么用?
答:
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?
答:
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。
为什么MongoDB的数据文件很大?
答:
MongoDB采用的预分配空间的方式来防止文件碎片。
复制集节点类型有哪些?
- 优先级0型(
Priority 0
)节点 - 隐藏型(
Hidden
)节点 - 延迟型(
Delayed
)节点 - 投票型(
Vote
)节点以及不可投票节点启用备份故障恢复需要多久
当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
答:
更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
答:
不会,只会在A:{B,C}上使用索引。
如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
答:
如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。
分析器在MongoDB中的作用是什么?
答:
分析器就是explain显示每次操作性能特点的数据库分析器。通过分析器可能查找比预期慢的操作。
如果用户移除对象的属性,该属性是否从存储层中删除?
答:
是的,用户移除属性然后对象会重新保存(re-save())。
能否使用日志特征进行安全备份?
答:
是的。
更新操作立刻fsync到磁盘?
答:
一般磁盘的写操作都是延迟执行的。
如何执行事务/加锁?
答:
因为mongodb设计就是轻量高性能,所以没有传统的锁和复杂的事务的回滚。
什么是master或primary?
答:
当前备份集群负责所有的写入操作的主要节点,在集群中,当主节点(master)失效,另一个成员会变为master。
getLastError的作用
答:
调用getLastError可以确认当前的写操作是否成功的提交。
分片(sharding)和复制(replication)是怎样工作的?
答:
分片可能是单一的服务器或者集群组成,推荐使用集群
数据在什么时候才会扩展到多个分片(shard)里?
答:
mongodb分片是基于区域的,所以一个集合的所有对象都放置在同一个块中,只有当存在多余一个块的时候,才会有多个分片获取数据的选项。
当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?
答:
会立即更新旧的分片,然后更改才会在所有权转移前复制到新的分片上
我怎么查看Mongo正在使用的链接?
答:
db._adminCommand("connPoolStats");
复制代码
mongodb的结构介绍
答:
数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成。
数据库的整体结构
答:
键值对–》文档–》集合–》数据库
MongoDB是由哪种语言写的?
答:
MongoDB用c++编写的,流行的开源数据库MySQL也是用C++开发的。C++1983年发行是一种使用广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式。
MongoDB的优势有哪些?
答:
面向文档的存储:以 JSON 格式的文档保存数据。
任何属性都可以建立索引。
复制以及高可扩展性。
自动分片。
丰富的查询功能。
快速的即时更新。
来自MongoDB的专业支持。
什么是集合?
答:
集合就是一组MongoDB文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。
什么是文档?
答:
文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。
什么是”mongod“ ?
答:
mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。
"mongod"参数有什么?
答:
传递数据库存储路径,默认是"/data/db"端口号 默认是 “27017”
什么是"mongo"
答:
它是一个命令行工具用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令它将使用默认的端口号和localhost连接。
MongoDB哪个命令可以切换数据库?
答:
MongoDB用use+数据库名称的方式来创建数据库。 use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。
>use database_name
复制代码
什么是非关系型数据库?
答:
非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和Web Apps等。
非关系型数据库有哪些类型?
答:
-Key-Value 存储 Eg:Amazon S3
图表 Eg:Neo4J
文档存储 Eg:MongoDB
基于列存储 Eg:Cassandra
为什么用MOngoDB?
答:
架构简单
没有复杂的连接
深度查询能力,MongoDB支持动态查询。
容易调试
容易扩展
不需要转化/映射应用对象到数据库对象
使用内部内存作为存储工作区,以便更快的存取数据。
在哪些场景使用MongoDB?
答:
规则: 如果业务中存在大量复杂的事务逻辑操作,则不要用MongoDB
数据库;在处理非结构化 / 半结构化的大数据使用MongoDB
,操作的数据类型为动态时也使用MongoDB
,比如:
- 内容管理系统,切面数据、日志记录
- 移动端
Apps
:O2O
送快递骑手、快递商家的信息(包含位置信息) - 数据管理,监控数据
MongoDB中的命名空间是什么意思?
答:
MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。
数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。
MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约 628字节,也即整个数据库的命名空间的上限约为24000。
如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。
要建立更多的集合的话,MongoDB也是支持的,只需要在启动时加上“–nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为2G。
每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。
需要注意的一个命名空间freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。
哪些语言支持MongoDB?
答:
C
C++
C#
Java
Node.js
Perl
Php 等
在MongoDB中如何创建一个新的数据库?
答:
MongoDB用 use+数据库名称 的方式来创建数据库。 use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。
>use mydb
>switched to db mydb
复制代码
在MongoDB中如何查看数据库列表
答:
使用命令"show dbs"
>show dbs
复制代码
MongoDB中的分片是什么意思?
答:
分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加以及读写操作的要求。
如何查看使用MongoDB的连接Sharding-MongoDB Manual21.如何查看使用MongoDB的连接?
答:
使用命令"db.adminCommand(“connPoolStats”)"
>db.adminCommand(“connPoolStats”)
复制代码
什么是复制?
答:
复制是将数据同步到多个服务器的过程,通过多个数据副本存储到多个服务器上增加数据可用性。复制可以保障数据的安全性,灾难恢复,无需停机维护(如备份,重建索引,压缩),分布式读取数据。
在MongoDB中如何在集合中插入一个文档
答:
要想将数据插入MongoDB集合中,需要使用 insert() 或 save() 方法。
>db.collectionName.insert({"key":"value"})
>>db.collectionName.save({"key":"value"})
复制代码
在MongoDB中如何除去一个数据库Collection Methods24.在MongoDB中如何除去一个数据库?
答:
MongoDB的dropDatabase() 命令用于删除已有数据库。
>db.dropDatabase()
复制代码
在MongoDB中如何创建一个集合?
答:
在MongoDB中,创建集合采用db.createCollection(name, options)方法。 options 是一个用来指定集合配置的文档。
>db.createCollection("collectionName")db.createCollection() - MongoDB Manual>db.createCollection("
复制代码
在MongoDB中如何查看一个已经创建的集合?
答:
可以使用show collections 查看当前数据库中的所有集合清单
>show collections
复制代码
在MongoDB中如何删除一个集合?
答:
MongoDB利用db.collection.drop() 来删除数据库中的集合。
>db.CollectionName.drop()
复制代码
为什么要在MongoDB中使用分析器?
答:
数据库分析工具(Database Profiler)会针对正在运行的mongod实例收集数据库命令执行的相关信息。包括增删改查的命令以及配置和管理命令。分析器(profiler)会写入所有收集的数据到 system.profile集合,一个capped集合在管理员数据库。分析器默认是关闭的你能通过per数据库或per实例开启。
MongoDB支持主键外键关系吗?
答:
默认MongoDB不支持主键和外键关系。 用Mongodb本身的API需要硬编码才能实现外键关联,不够直观且难度较大。可以参考以下链接。
MongoDB支持哪些数据类型?
答:
String
Integer
Double
Boolean
Object
Object ID
Arrays
Min/Max Keys
Datetime
Code
Regular Expression等。
为什么要在MongoDB中用"Code"数据类型?
答:
"Code"类型用于在文档中存储JavaScript代码。
为什么要在MongoDB中用"Regular Expression"数据类型?
答:
"Regular Expression"类型用于在文档中存储正则表达式
为什么在MongoDB中使用"Object ID"数据类型?
答:
"ObjectID"数据类型用于存储文档id
如何在集合中插入一个文档?
答:
要想将数据插入 MongoDB 集合中,需要使用insert()或save()方法。
>db.collectionName.insert({"key":"value"})
> >db.collectionName.save({"key":"value"})
复制代码
"ObjectID"有哪些部分组成?
答:
一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器_id是一个12字节长的十六进制数,它保证了每一个文档的唯一性。在插入文档时,需要提供_id 。如果你不提供,那么MongoDB就会为每一文档提供一个唯一的id。 _id的头4个字节代表的是当前的时间戳,接着的后3个字节表示的是机器id 号,接着的2个字节表示MongoDB服务器进程id,最后的3个字节代表递增值。
在MongoDb中什么是索引
答:
索引用于高效的执行查询.没有索引MongoDB将扫描查询整个集合中的所有文档这种扫描效率很低,需要处理大量数据。索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
如何添加索引?
答:
使用db.collection.createIndex() 在集合中创建一个索引
>db.collectionName.createIndex({columnName:1})
复制代码
用什么方法可以格式化输出结果?
答:
使用pretty() 方法可以格式化显示结果
>db.collectionName.find().pretty()
复制代码
如何使用"AND"或"OR"条件循环查询集合中的文档?
答:
在find() 方法中,如果传入多个键,并用逗号( , )分隔它们,那么MongoDB会把它看成是AND条件。
>db.mycol.find({key1:value1, key2:value2}).pretty()
复制代码
若基于OR条件来查询文档,可以使用关键字$or。
db.mycol.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
在MongoDB中如何更新数据?
答:
update() 与save() 方法都能用于更新集合中的文档。 update() 方法更新已有文档中的值,而save() 方法则是用传入该方法的文档来替换已有文档。
db.collectionName.update({key:value},{$set:{newkey:newValue}})
如何删除文档?
答:
MongoDB利用 remove() 方法 清除集合中的文档。它有2个可选参数:
deletion criteria:(可选)删除文档的标准。
justOne:(可选)如果设为 true 或 1,则只删除一个文档。
db.collectionName.remove({key:value})
monogodb
中的分片sharding
分片sharding
是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长 时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加 以及读写操作的要求。
在MongoDB中如何排序?
答:
MongoDB中的文档排序是通过sort() 方法来实现的。 sort() 方法可以通过一些参数来指定要进行排序的字段,并使用1和-1来指定排序方式,其中1表示升序,而-1表示降序。
db.connectionName.find({key:value}).sort({columnName:1})
什么是聚合?
答:
聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于SQL中的count(*) 组合 group by。对于MongoDB中的聚合操作,应该使用aggregate() 方法。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在MongoDB中什么是副本集?
答:
在MongoDB中副本集由一组MongoDB实例组成,包括一个主节点多个次节点,MongoDB客户端的所有数据都写入主节点(Primary),副节点从主节点同步写入数据,以保持所有复制集内存储相同的数据,提高数据可用性。