当前位置: 首页 > 科技观察

进大厂必看的MongoDB面试题合集

时间:2023-03-19 22:13:54 科技观察

1。什么是MongoDB?MongoDB是用C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,增加更多的节点可以保证服务器的性能。MongoDB旨在为Web应用程序提供可扩展、高性能的数据存储解决方案。MongoDB将数据存储为文档,数据结构由键值对(key=>value)组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档、数组和文档数组。2、MongoDB有什么特点?MongoDB是一个面向文档存储的数据库,比较简单易操作。您可以在MongoDB记录中的任何属性上设置索引(例如:FirstName="Sameer",Address="8GandhiRoad")以实现更快的排序。您可以在本地或通过网络创建数据镜像,这使得MongoDB更具可扩展性。如果负载增加(需要更多的存储空间和更多的处理能力),它可以分布在计算机网络中的其他节点之间。这称为分片。MongoDB支持丰富的查询表达式。查询命令使用JSON格式的标签,可以方便的查询文档中嵌入的对象和数组。MongoDB使用update()命令来替换完成的文档(数据)或一些指定的数据字段。MongoDB中的Map/Reduce主要用于对数据进行批处理和聚合操??作。映射和减少。Map函数调用emit(key,value)遍历集合中的所有记录,将key和value传递给Reduce函数进行处理。Map函数和Reduce函数是用Javascript编写的,可以通过db.runCommand或mapreduce命令执行MapReduce操作。GridFS是MongoDB的一个内置特性,可以用来存储大量的小文件。MongoDB允许在服务器端执行脚本。您可以用JavaScript编写一个函数并直接在服务器端执行它。也可以将函数的定义保存在服务器端,下次直接调用。3.NoSQL数据库是什么意思?NoSQL和RDBMS之间的直接区别是什么?为什么使用和不使用NoSQL数据库?谈谈NoSQL数据库的一些优势?NoSQL是一种非关系型数据库,NoSQL=NotOnlySQL。关系数据库使用结构化数据,而NoSQL使用键值对来存储数据。在处理非结构化/半结构化大数据时,在横向扩展时,随时处理动态增加的数据项时,可以优先使用NoSQL数据库。在考虑数据库的成熟度、支持、分析和商业智能、管理和专业性时,应优先考虑关系数据库。4.NoSQL数据库有哪些类型?NoSQL数据库的类型如:MongoDB、Cassandra、CouchDB、Hypertable、Redis、Riak、HBASE、Memcache等。5.MySQL和MongoDB最基本的区别是什么?MySQL和MongoDB都是免费的开源数据库。MySQL和MongoDB之间存在许多根本差异,包括数据表示、查询、关系、事务、模式设计和定义、规范化、速度和性能。通过比较MySQL和MongoDB,我们实际上是在比较关系数据库和非关系数据库,即数据存储结构不同。6.你如何比较MongoDB、CouchDB和CouchBase?MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库最典型的代表。除了都存储为文档外,它们没有任何共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储、复制方式等方面有很多不同。7.是什么让MongoDB成为最好的NoSQL数据库?以下特性使MongoDB成为最好的NoSQL数据库:面向文件的高性能、高可用、易扩展、丰富的查询语言8.日志回放会遇到条目(entry)不完整时的问题(比如刚好有一个中途失败)?每个日志(组)的写入是一致的,除非完成,否则在恢复期间不会回放。9、MongoDB中分析器的作用是什么?MongoDB包括一个数据库分析器,它显示数据库中每个操作的性能特征。使用此分析器,您可以找到比预期慢的查询(或写入);例如,使用此信息,您可以确定是否需要添加索引。10.什么是命名空间?MongoDB将BSON对象存储在集合中。由句点连接的数据库名称和集群名称称为命名空间。11.如果用户删除了对象的某个属性,该属性是否从存储层中删除?是的,用户删除了属性并重新保存了对象(re-save())。12、日志功能可以用来做安全备份吗?是的。13.允许空值吗?对于对象成员,是的。但是用户不能向数据库集合(collection)中添加空值(null),因为空值不是对象,但是用户可以添加空对象{}。14.更新操作是否立即fsync到磁盘?不,默认情况下磁盘写入会延迟。写入操作可能需要两到三秒(默认情况下在60秒内)才能到达磁盘。例如,如果数据库在一秒钟内接收到一千个递增对象的操作,则磁盘只会刷新一次。(注意,尽管fsync选项在命令行和通过getLastError_old有效)15.如何执行事务/锁?MongoDB不使用传统的锁或带有回滚的复杂事务,因为它被设计为轻量级、快速和可预测的性能。可以类比MySQLMylSAM的自动提交模式。通过简化对事务的支持来提高性能,尤其是在可能跨越多个服务器的系统中。16.为什么我的数据文件这么大?MongoDB主动预分配空间以防止文件系统碎片化。17.启用备份故障恢复需要多长时间?从备库宣布主库宕机到备库被选为主库,需要10到30秒的时间。在此期间对主数据库的操作将失败-包括写入和强一致性读取。但是,您仍然可以在辅助数据库上执行最终一致的查询(在slaveOk模式下),即使在此期间也是如此。18.什么是master和primary?它是负责当前备份集群(副本集)中所有写操作的主节点/成员。在备份集群中,当发生故障转移事件时,一个额外的成员成为主要成员。19.什么是次要或奴隶?Secondary从当前primary复制相应的操作。它通过跟踪复制的oplog(local.oplog.rs)来做到这一点。20.是否必须调用getLastError来确保写入操作生效?不需要。无论您是否调用getLastError(又名安全模式),服务器都会做同样的事情。调用getLastError只是为了确认写入操作已成功提交。当然,你经常希望得到确认,但是写操作的安全性和有效性并不是由这个决定的。21.我应该启动集群分片还是非集群分片MongoDB环境?为了开发方便,我们建议以非分片模式启动MongoDB环境,除非一台服务器不足以存储您的初始数据集。从非集群分片升级到集群分片是无缝的,因此当您的数据集不是很大时,无需考虑集群分片。22.分片和复制如何工作?每个分片都是分区数据的逻辑集合。分片可以由单个服务器或集群组成,我们建议为每个分片使用一个集群。23、数据什么时候扩容到多个分片?MongoDB分片基于范围。所以集合中的所有对象都存储在一个块中。只有当有多个区块时,才会有多个分片取数据的选项。现在,每个默认块大小为64Mb,因此您至少需要64Mb才能实现迁移。24.当我尝试更新正在迁移的块上的文档时会发生什么?更新操作立即在旧分片上发生,然后在所有权转移之前将更改复制到新分片。25.如果我在分片停止或变慢时发起查询,会发生什么情况?如果分片停止,查询将返回错误,除非为查询设置了“部分”选项。如果分片响应缓慢,Mon??goDB将等待它响应。26.我可以删除moveChunk目录下的旧文件吗?没问题,这些文件是分片平衡时产生的临时文件。一旦完成这些操作,相关的临时文件也应该被删除。但目前清理是手动的,所以请仔细考虑为这些文件释放空间。27.如何查看MongoDB正在使用的链接?db._adminCommand("connPoolStats");28.如果块移动操作(moveChunk)失败,我是否需要手动清除部分传输文件?不,移动操作是一致且确定的;失败后,移动操作将不断重试;完成后,数据只会出现在新的分片(shard)中。29.如果我正在使用复制技术(replication),我可以对某些部分使用日志记录而对其他部分不使用吗?能。30.在正在迁移的Chunk上更新文档时会发生什么?更新立即发生在旧块上,然后在所有权转移之前将更改复制到新分片。31、MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会用到索引吗?不,索引只会在A:{B,C}上使用。32.如果在分片停止或变慢时启动查询会怎样?如果分片停止,查询将返回错误,除非为查询设置了“部分”选项。如果分片响应缓慢,Mon??goDB将等待它响应。33.MongoDB是否支持存储过程?如果支持,如何使用?MongoDB支持存储过程,这些存储过程用JavaScript编写并存储在db.system.js表中。34、如何理解MongoDB中的GridFS机制,MongoDB为什么要使用GridFS来存储文件?GridFS是一种用于在MongoDB中存储大文件的文件规范。使用GridFS可以将大文件拆分成多个小文件进行存储,这样我们就可以有效的保存大文件,解决BSON对象限制的问题。35、为什么MongoDB的数据文件这么大?MongoDB使用预先分配的空间来防止文件碎片。36、MongoDB中analyzer的作用是什么?探查器是解释每个操作的性能特征的数据库探查器。探查器可能会查找比预期慢的操作。37.如何执行交易/锁?因为MongoDB在设计上是轻量级和高性能的,没有传统的锁和复杂的事务回滚。38.getLastError的作用是什么?调用getLastError确认当前写操作是否提交成功。39.MongoDB的结构介绍?数据库中存储的对象设计bson,一个由键值对组成的类json二进制文件。40.数据库的总体结构是怎样的?键值对-》文档-》集合-》数据库41.MongoDB是用什么语言编写的?MongoDB是用C++编写的,流行的开源数据库MySQL也是如此。C++于1983年发布,是一种广泛使用的计算机编程语言。是一种简单易用的编程语言,支持多种编程模型。42.MongoDB有什么优点?Document-OrientedStorage:将数据保存为JSON格式的文档。任何属性都可以被索引。可复制和高扩展性.自动分片.丰富的查询功能.快速即时更新.MongoDB的专业支持.43.什么是集合?集合简单来说就是一组MongoDB文档.相当于关系型数据库(RDBMS)中表的概念.集合在一个单独的数据库中。一个集合中的多个文档可以有很多不同的字段。一般来说,一个集合中的文档都服务于相同或相关的目的。44.什么是文档?文档由一组键组成值。文档是动态的,这意味着同一集合中的文档不需要具有相同的字段和结构。关系数据库中表中的每条记录相当于MongoDB中的一个文档。45.什么是“mongod”?mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,并执行后台管理操作。当我们运行mongod命令时,这意味着MongoDB进程正在启动并在后台运行。46.“mongod”的参数是什么?传递数据库存储路径,默认为“/data/db”默认端口号为“27017”47、什么是“mongo”?它是一个命令行工具,用于连接到特定的mongod实例。当我们运行不带参数的mongo命令时,它将使用默认端口号和本地主机连接。48.如何在MongoDB中新建一个数据库?MongoDB使用use+数据库名来创建数据库。use将创建一个新数据库,如果存在则返回该数据库。49.什么是非关系型数据库?非关系型数据库是不同于传统关系型数据库的数据库的总称。非关系型数据库的一个显着特点是不使用SQL作为查询语言,数据存储不需要特定的表模式。由于其简单的设计和非常好的性能,它被用于大数据和Web应用程序。50.非关系型数据库有哪些类型?-Key-Value存储,eg:AmazonS3图表,eg:Neo4J文档存储,eg:MongoDB列式存储,eg:Cassandra51,为什么要用MongoDB?结构简单,没有复杂的连接深度查询能力。MongoDB支持动态查询,易于调试,易于扩展。无需将应用程序对象转换/映射到数据库对象。使用内部存储器作为存储工作区,以加快数据访问速度。52.MongoDB在哪些场景下使用?大数据内容管理系统移动应用数据管理53.MongoDB中的命名空间是什么意思?MongoDB有预分配空间的机制,每个预分配的文件都用0填充。每新分配一个数据文件,它的大小是前一个数据文件大小的两倍,每个数据文件的最大大小是2G。MongoDB的每个集合和索引都对应一个命名空间。这些命名空间的元数据集中在16M的*.ns文件中,每个名字平均占用628字节左右,是整个数据库命名空间的上限。为24000。如果每个集合都有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。使用更多索引,可以创建更少的集合。同时,如果集合数量过多,一些操作也会变慢。如果你想创建更多的集合,MongoDB也支持。只需要在启动时加上“--nssize”参数,就可以让数据库对应的命名空间文件变大,保存更多的名字。这个命名空间文件(.ns文件)最大可达2G。每个名称空间对应的范围不一定是连续的。与数据文件的增长类似,每个namespace对应的extentsize随着分配次数的增加而不断增长。目的是平衡命名空间浪费的空间,保持命名空间数据的连续性。需要注意的一个命名空间$freelist,这个命名空间用来记录不再使用的extents(删除的Collection或index)。每当namespace需要分配新的extent时,它会首先检查$freelist,看是否有合适的extent可供使用,如果有,就回收空闲磁盘空间。54.哪些语言支持MongoDB?C、C++、C#、Java、Node.js、Perl、PHP等55.如何查看MongoDB中的数据库列表?使用命令:showdbs56,MongoDB中的分片是什么意思?分片是将数据水平划分到不同的物理节点。当应用数据越来越大时,数据量也会越来越大。当数据量增长时,单台机器可能无法存储数据或具有可接受的读写吞吐量。可以利用分片技术来增加更多的机器来应对数据量的增加和读写操作的要求。57.什么是抄袭?复制是将数据同步到多个服务器以通过在多个服务器上存储多个数据副本来提高数据可用性的过程。复制可以保证数据安全、容灾、不停机维护(如备份、重建索引、压缩)、分布式读取数据。58.如何在MongoDB的集合中插入文档?要将数据插入MongoDB集合,您需要使用insert()或save()方法。>db.collectionName.insert({"key":"value"})>db.collectionName.save({"key":"value"})59.如何删除MongoDB中的一个数据库?MongoDB的dropDatabase()命令用于删除已有的数据库:>db.dropDatabase()60.如何在MongoDB中创建集合?在MongoDB中,使用db.createCollection(name,options)方法创建一个集合。options是一个文档,用于指定集合的??配置。>db.createCollection("collectionName")db.createCollection()-MongoDBManual>db.createCollection()61.如何在MongoDB中查看创建的集合?您可以使用showcollections查看当前数据库中所有集合的列表:>showcollections62。如何删除MongoDB中的集合?MongoDB使用db.collection.drop()来删除数据库中的集合:>db.CollectionName.drop()63.为什么在MongoDB中使用分析器?DatabaseProfiler收集有关正在运行的mongod实例的数据库命令执行的信息。包括增删改查命令,以及配置和管理命令。探查器会将所有收集到的数据写入system.profile集合,这是管理员数据库中的一个上限集合。默认情况下禁用探查器,您可以为每个数据库或每个实例启用它。64、MongoDB是否支持主键外键关系?默认情况下,MongoDB不支持主键和外键关系。使用MongoDB自带的API需要硬编码实现外键关联,不够直观,难度大。65.MongoDB支持哪些数据类型?String,Integer,Double,Boolean,Object,ObjectID,Arrays,Min/MaxKeys,Datetime,Code,RegularExpression,etc.66.为什么在MongoDB中使用“代码”数据类型?“代码”类型用于在文档中存储JavaScript代码。67.为什么在MongoDB中使用“正则表达式”数据类型?“正则表达式”类型用于在文档中存储正则表达式。68.为什么在MongoDB中使用“ObjectID”数据类型?“ObjectID”数据类型用于存储文档ID。69.“ObjectID”的组成部分有哪些?一共有四部分:时间戳、客户端ID、客户端进程ID、三字节递增计数器。_id是一个12字节长的十六进制数,保证了每个文档的唯一性。插入文档时,需要提供_id。如果您不提供它,那么MongoDB将为每个文档提供一个唯一的id。_id的前4个字节表示当前时间戳,接下来的3个字节表示机器ID号,接下来的2个字节表示MongoDB服务器进程ID,最后3个字节表示增量值。70.MongoDB中的索引是什么?索引用于有效地执行查询。如果没有索引,MongoDB将扫描并查询整个集合中的所有文档。这种扫描效率很低,需要处理大量数据。索引是一种特殊的数据结构,它以易于遍历的形式保存一小块数据集。索引可以存储特定字段或字段集的值,并按照索引指定的方式对字段值进行排序。71.如何添加索引?使用db.collection.createIndex()在集合中创建索引:>db.collectionName.createIndex({columnName:1})72.可以用什么方法格式化输出结果?使用pretty()方法格式化并显示结果:>db.collectionName.find().pretty()73.如何使用“AND”或“OR”条件循环遍历集合中的文档?在find()方法中,如果传入多个key,并用逗号(,)分隔,MongoDB会将其视为AND条件。>db.mycol.find({key1:value1,key2:value2}).pretty()根据OR条件查询文档,可以使用关键字$or。>db.mycol.find({$or:[{key1:value1},{key2:value2}]}).pretty()74.如何更新MongoDB中的数据?update()和save()方法都可用于更新集合中的文档。update()方法更新现有文档中的值,save()方法用传递给该方法的文档替换现有文档。75.如何删除文件?MongoDB使用remove()方法从集合中清除文档。它有2个可选参数:删除条件:(可选)删除文档的条件。justOne:(可选)如果设置为true或1,则只会删除一个文档。>db.collectionName.remove({key:value})76.如何在MongoDB中进行排序?MongoDB中的文档排序是通过sort()方法实现的。sort()方法可以传递一些参数来指定需要排序的字段,用1和-1来指定排序方式,其中1表示升序,-1表示降序。>db.connectionName.find({key:value}).sort({columnName:1})77.什么是聚合?聚合操作处理数据记录并返回计算结果。聚合操作组合来自多个文档的值,对数据组执行各种操作,并返回单个结果。相当于SQL中的count(*)组合groupby。对于MongoDB中的聚合操作,应该使用aggregate()方法。>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)78.MongoDB中的副本集是什么?在MongoDB中,副本集由一组MongoDB实例组成,包括一个主节点和多个从节点。MongoDB客户端所有数据写入主节点(Primary),从节点从主节点同步写入数据,维护所有副本集。在内部存储相同的数据以提高数据可用性。