28个MongoDB经典⾯试题详解
MongoDB是⽬前最好的⾯向⽂档的免费开源NoSQL数据库。
如果你正准备参加MongoDB NoSQL数据库的技术⾯试,你最好看看下⾯的MongoDB NoSQL⾯试问答。
这些MongoDB NoSQL⾯试问答涵盖了NoSQL数据库基本的概念,复制(Replication),分⽚(Sharding),事务和锁,跟踪分析⼯具(Profiler),Nuances和⽇志等特性。
让我们看看下⾯的这些MongoDB NoSQL数据库的⾯试问答吧:
1. 你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使⽤和不使⽤NoSQL数据库?说⼀说NoSQL 数据库的⼏个优点?
NoSQL是⾮关系型数据库,NoSQL = Not Only SQL。
关系型数据库采⽤的结构化的数据,NoSQL采⽤的是键值对的⽅式存储数据。
在处理⾮结构化/半结构化的⼤数据时;在⽔平⽅向上进⾏扩展时;随时应对动态增加的数据项时可以优先考虑使⽤NoSQL数据库。
在考虑数据库的成熟度;⽀持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
2. NoSQL数据库有哪些类型?
NoSQL数据库的类型
例如:MongoDB, Cassandra, CouchDB, Hypertable, Redis, Riak, Neo4j, HBASE, Couchbase, MemcacheDB, RevenDB and Voldemort are the examples of NoSQL databases.详细阅读。
3. MySQL与MongoDB之间最基本的差别是什么?
MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表⽰(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。
通过⽐较MySQL和MongoDB,实际上我们是在⽐较关系型和⾮关系型数据库,即数据存储结构不同。详细阅读
4. 你怎么⽐较MongoDB、CouchDB及CouchBase?
MongoDB和CouchDB都是⾯向⽂档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。除了都以⽂档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接⼝、对象存储以及复制⽅法等⽅⾯有很多不同。
细节可以参见下⾯的链接:
MongDB vs CouchDB
CouchDB vs CouchBase
5. MongoDB成为最好NoSQL数据库的原因是什么?
以下特点使得MongoDB成为最好的NoSQL数据库:
⾯向⽂件的
⾼性能
⾼可⽤性
易扩展性
丰富的查询语⾔
6.32位系统上有什么细微差别?
sql查询面试题及答案journaling会激活额外的内存映射⽂件。这将进⼀步抑制32位版本上的数据库⼤⼩。因此,现在journaling在32位系统上默认是禁⽤的。
7. journal回放在条⽬(entry)不完整时(⽐如恰巧有⼀个中途故障了)会遇到问题吗?
每个journal (group)的写操作都是⼀致的,除⾮它是完整的否则在恢复过程中它不会回放。
8. 分析器在MongoDB中的作⽤是什么?
MongoDB中包括了⼀个可以显⽰数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以到⽐预期慢的查询(或写操作);利⽤这⼀信息,⽐如,可以确定是否需要添加索引。
9. 名字空间(namespace)是什么?
MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。
10. 如果⽤户移除对象的属性,该属性是否从存储层中删除?
是的,⽤户移除属性然后对象会重新保存(re-save())。
11. 能否使⽤⽇志特征进⾏安全备份?
是的。
12. 允许空值null吗?
对于对象成员⽽⾔,是的。然⽽⽤户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象。然⽽⽤户能够添加空对象{}。
13. 更新操作⽴刻fsync到磁盘?
不会,磁盘写操作默认是延迟执⾏的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果⼀秒内数据库收到⼀千个对⼀个对象递增的操作,仅刷新磁盘⼀次。(注意,尽管fsync选项在命令⾏和经过getLastError_old是有效的)(译者:也许是坑⼈的⾯试题??)。
14. 如何执⾏事务/加锁?
MongoDB没有使⽤传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的⾼性能。可以把它类⽐成MySQL MylSAM的⾃动提交模式。通过精简对事务的⽀持,性能得到了提升,特别是在⼀个可能会穿过多个服务器的系统⾥。
15. 为什么我的数据⽂件如此庞⼤?
MongoDB会积极的预分配预留空间来防⽌⽂件系统碎⽚。
16. 启⽤备份故障恢复需要多久?
从备份数据库声明主数据库宕机到选出⼀个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败--包括写⼊和强⼀致性读取(strong consistent read)操作。然⽽,你还能在第⼆数据库上执⾏最终⼀致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间⾥。
17. 什么是master或primary?
它是当前备份集(replica set)中负责处理所有写⼊操作的主要节点/成员。在⼀个备份集中,当失效备援(failover)事件发⽣时,⼀个另外的成员会变成primary。
18. 什么是secondary或slave?
Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。
19. 我必须调⽤getLastError来确保写操作⽣效了么?
不⽤。不管你有没有调⽤getLastError(⼜叫"Safe Mode")服务器做的操作都⼀样。调⽤getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否⽣效不是由这个决定的。
20. 我应该启动⼀个集分⽚(sharded)还是⼀个⾮集分⽚的 MongoDB 环境?
为开发便捷起见,我们建议以⾮集分⽚(unsharded)⽅式开始⼀个 MongoDB 环境,除⾮⼀台服务器不⾜以存放你的初始数据集。从⾮集分⽚升级到集分⽚(sharding)是⽆缝的,所以在你的数据集还不是很⼤的时候没必要考虑集分⽚(sharding)。
21. 分⽚(sharding)和复制(replication)是怎样⼯作的?
每⼀个分⽚(shard)是⼀个分区数据的逻辑集合。分⽚可能由单⼀服务器或者集组成,我们推荐为每⼀个分⽚(shard)使⽤集。
22. 数据在什么时候才会扩展到多个分⽚(shard)⾥?
MongoDB 分⽚是基于区域(range)的。所以⼀个集合(collection)中的所有的对象都被存放到⼀个块(chunk)中。只有当存在多余⼀个块的时候,才会有多个分⽚获取数据的选项。现在,每个默认块的⼤⼩是 64Mb,所以你需要⾄少 64 Mb 空间才可以实施⼀个迁移。
23. 当我试图更新⼀个正在被迁移的块(chunk)上的⽂档时会发⽣什么?
更新操作会⽴即发⽣在旧的分⽚(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分⽚上。
24. 如果在⼀个分⽚(shard)停⽌或者很慢的时候,我发起⼀个查询会怎样?
如果⼀个分⽚(shard)停⽌了,除⾮查询设置了“Partial”选项,否则查询会返回⼀个错误。如果⼀个分⽚(shard)响应很
慢,MongoDB则会等待它的响应。
25. 我可以把moveChunk⽬录⾥的旧⽂件删除吗?
没问题,这些⽂件是在分⽚(shard)进⾏均衡操作(balancing)的时候产⽣的临时⽂件。⼀旦这些操作已经完成,相关的临时⽂件也应该被删除掉。但⽬前清理⼯作是需要⼿动的,所以请⼩⼼地考虑再释放这些⽂件的空间。
26. 我怎么查看 Mongo 正在使⽤的链接?
db._adminCommand("connPoolStats");
27. 如果块移动操作(moveChunk)失败了,我需要⼿动清除部分转移的⽂档吗?
不需要,移动操作是⼀致(consistent)并且是确定性的(deterministic);⼀次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分⽚⾥(shard)。
28. 如果我在使⽤复制技术(replication),可以⼀部分使⽤⽇志(journaling)⽽其他部分则不使⽤吗?
可以。
29.当更新⼀个正在被迁移的块(Chunk)上的⽂档时会发⽣什么?
更新操作会⽴即发⽣在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分⽚上。
30.MongoDB在A:{B,C}上建⽴索引,查询A:{B,C}和A:{C,B}都会使⽤索引吗?
不会,只会在A:{B,C}上使⽤索引。
31.如果⼀个分⽚(Shard)停⽌或很慢的时候,发起⼀个查询会怎样?
如果⼀个分⽚停⽌了,除⾮查询设置了“Partial”选项,否则查询会返回⼀个错误。如果⼀个分⽚响应很慢,MongoDB会等待它的响应。
32. MongoDB⽀持存储过程吗?如果⽀持的话,怎么⽤?
MongoDB⽀持存储过程,它是javascript写的,保存在db.system.js表中。
33.如何理解MongoDB中的GridFS机制,MongoDB为何使⽤GridFS来存储⽂件?
GridFS是⼀种将⼤型⽂件存储在MongoDB中的⽂件规范。使⽤GridFS可以将⼤⽂件分隔成多个⼩⽂档存放,这样我们能够有效的保存⼤⽂档,⽽且解决了BSON对象有限制的问题。
更多关于MongoDB经典⾯试题请查看下⾯的相关链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论