• [交流吐槽] 进大厂必看的 MongoDB 面试题集锦
    1、MongoDB是什么?MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。2、MongoDB有哪些特点? MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。 你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。 MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 MongoDB使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。 MongoDB中的Map/Reduce主要是用来对数据进行批量处理和聚合操作。 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 = Not Only SQL。关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。在处理非结构化/半结构化的大数据时,在水平方向上进行扩展时,随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。再考虑数据库的成熟度,支持,分析和商业智能,管理及专业性等问题时,应优先考虑关系型数据库。4、NoSQL数据库有哪些类型?NoSQL数据库的类型例如:MongoDB、Cassandra、CouchDB、Hypertable、Redis、Riak、HBASE、Memcache等.5、MySQL与MongoDB之间最基本的差别是什么?MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。通过比较MySQL和MongoDB,实际上我们是在比较关系型和非关系型数据库,即数据存储结构不同。6、你怎么比较MongoDB、CouchDB及CouchBase?MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。除了都以文档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有很多不同。7、MongoDB成为最好NoSQL数据库的原因是什么?以下特点使得MongoDB成为最好的NoSQL数据库: 面向文件的 高性能 高可用性 易扩展性 丰富的查询语言8、journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?每个journal(group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。9、分析器在MongoDB中的作用是什么?MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。10、namespace是什么?MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连接起来叫做namespace。11、如果用户移除对象的属性,该属性是否从存储层中删除?是的,用户移除属性然后对象会重新保存(re-save())。12、能否使用日志特征进行安全备份?是的。13、允许空值null吗?对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象,然而用户能够添加空对象{}。14、更新操作立刻fsync到磁盘?不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和经过getLastError_old是有效的)15、如何执行事务/加锁?MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。16、为什么我的数据文件如此庞大?MongoDB会积极的预分配预留空间来防止文件系统碎片。17、启用备份故障恢复需要多久?从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败——包括写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间里。18、什么是master或primary?它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。19、什么是secondary或slave?Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。20、我必须调用getLastError来确保写操作生效了么?不用。不管你有没有调用getLastError(又叫Safe Mode)服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。21、我应该启动一个集群分片(sharded)还是一个非集群分片的MongoDB环境?为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个MongoDB环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。22、分片(sharding)和复制(replication)是怎样工作的?每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。23、数据在什么时候才会扩展到多个分片(shard)里?MongoDB分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是64Mb,所以你需要至少64Mb空间才可以实施一个迁移。24、当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上。25、如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。26、我可以把moveChunk目录里的旧文件删除吗?没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件。一旦这些操作已经完成,相关的临时文件也应该被删除掉。但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间。27、我怎么查看MongoDB正在使用的链接?db._adminCommand("connPoolStats"); 28、如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。29、如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?可以。30、当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。31、MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?不会,只会在A:{B,C}上使用索引。32、如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。33、MongoDB支持存储过程吗?如果支持的话,怎么用?MongoDB支持存储过程,它是JavaScript写的,保存在db.system.js表中。34、如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。35、为什么MongoDB的数据文件很大?MongoDB采用的预分配空间的方式来防止文件碎片。36、分析器在MongoDB中的作用是什么?分析器就是explain显示每次操作性能特点的数据库分析器。通过分析器可能查找比预期慢的操作。37、如何执行事务/加锁?因为MongoDB设计就是轻量高性能,所以没有传统的锁和复杂的事务的回滚。38、getLastError的作用?调用getLastError可以确认当前的写操作是否成功的提交。39、MongoDB的结构介绍?数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成。40、数据库的整体结构?键值对–》文档–》集合–》数据库41、MongoDB是由哪种语言写的?MongoDB用C++编写的,流行的开源数据库MySQL也是用C++开发的。C++于1983年发行,是一种使用广泛的计算机程序设计语言。它是一种痛用程序设计语言,支持多种编程模式。42、MongoDB的优势有哪些? 面向文档的存储:以JSON格式的文档保存数据。 任何属性都可以建立索引。 复制以及高可扩展性。 自动分片。 丰富的查询功能。 快速的即时更新。 来自MongoDB的专业支持。43、什么是集合?集合就是一组MongoDB文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。44、什么是文档?文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。45、什么是“mongod”?mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。46、“mongod”参数有什么? 传递数据库存储路径,默认是“/data/db” 端口号默认是“27017”47、什么是“mongo”?它是一个命令行工具,用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令,它将使用默认的端口号和localhost连接。48、在MongoDB中如何创建一个新的数据库?MongoDB用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。49、什么是非关系型数据库?非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和Web Apps等。50、非关系型数据库有哪些类型? -Key-Value 存储,eg:Amazon S3 图表,eg:Neo4J 文档存储,eg:MongoDB 基于列存储,eg:Cassandra51、为什么用MongoDB? 架构简单 没有复杂的连接 深度查询能力,MongoDB支持动态查询 容易调试 容易扩展 不需要转化/映射应用对象到数据库对象 使用内部内存作为存储工作区,以便更快的存取数据52、在哪些场景使用MongoDB? 大数据 内容管理系统 移动端Apps 数据管理53、MongoDB中的命名空间是什么意思?MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约628字节,也即整个数据库的命名空间的上限约为24000。如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。要建立更多的集合的话,MongoDB也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为2G。每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。54、哪些语言支持MongoDB?C、C++、C#、Java、Node.js、Perl、PHP等。55、在MongoDB中如何查看数据库列表?使用命令:show dbs 
  • [行业资讯] MongoDB在 2022 MongoDB 全球用户大会上发布新愿景, 致力成为开发者数据平台提供商
    美国东部时间6月7日,MongoDB (NASDAQ代码:MDB) 2022 年度全球用户大会 (MongoDB World) 在美国纽约隆重开幕。大会上,MongoDB 发布公司新愿景,致力成为开发者数据平台提供商,同时还发布了一系列变革性的新功能。随着新愿景及功能的发布,MongoDB将赋能开发团队加快创新步伐,借助统一的集成式开发者数据平台满足更为广泛的用例需求,提供覆盖全数据生命周期的服务,进行现代应用架构优化,并实现最精密的数据加密技术。MongoDB总裁兼首席执行官Dev Ittycheria表示:“未来几年,不计其数的全新应用程序将不断面世,这些应用程序可以提供令人惊艳的客户体验,满足企业转型的功能需求,通过更尖端的自动化水平提高运营效率等,这些都离不开一个高度可扩展、云原生、全球分布式的数据平台。MongoDB的愿景是打造开发者数据平台,为开发者提供现代、便捷的使用体验,广泛支持各种用例,并满足最为严苛的性能和规模要求。”满足更广泛的用例需求MongoDB已借助统一的平台,将其别具一格的数据服务方法延伸至联机运营场景和事务场景以外的搜索和分析用例。这些增强功能在提升团队工作效率的同时,还能确保始终一致的开发者体验,降低数据基础设施的复杂性,更好地满足下一代应用程序的需求。• MongoDB发布了一系列全新功能,可帮助开发者更轻松地构建应用程序内分析能力,并打造更丰富的应用体验。拟于今年晚些时候推出的列存储索引(Column store indexing)功能,将助力用户创建和维护专门的索引,无需对文档结构进行任何更改或将数据迁移到其他系统,从而大幅提升许多常见分析查询的速度。此外,分析节点目前已支持单独扩展,便于团队独立调整其操作和分析查询性能,避免出现过度配置或配置不足情况。  • MongoDB时间序列集合功能可以简化应用程序构建,加快构建速度并降低成本,这些应用程序旨在监测物理系统、跟踪资产或处理财务数据。在即将发布的MongoDB 6.0版本中,时间序列集合功能将支持测量数据库的二级索引,并针对读取性能进行改进和优化,以便更快地对时序数据进行排序。• Atlas Search 是在应用程序中构建基于相关性搜索功能的最迅速且最简单的方法。如今,借助搜索分面(Search Facets)功能,开发者能够快速构建搜索体验,确保终端用户能够更加顺畅地浏览、细分或按照不同维度优化搜索结果。提供覆盖数据生命周期的服务  MongoDB发布了众多新产品和功能,使开发团队能够更好地分析、转换和迁移Atlas中的数据,同时减少对可能造成延迟、制约生产效率和增加成本的批处理及ETL作业的依赖。  • Atlas Data Lake 将提供完全托管式存储能力,采用高性价比的云对象存储,同时针对高性能分析查询进行优化。Atlas Data Lake在从Atlas数据库获取数据时,会重新格式化、创建分区索引并对数据进行分区,从而创建一个高性能的伴生数据湖。  • Atlas Data Federation功能可以帮助开发团队创建虚拟数据库,以便处理驻留在不同源头的数据。开发团队可以在一个或多个集合、MongoDB集群和存储桶之间查询、转换或创建视图。  • Atlas SQL Interface为主要使用SQL工具的数据分析师提供了在只读界面中与Atlas进行数据交互的绝佳体验。这样一来,数据分析师可以使用SQL工具轻松完成Atlas数据的本地查询和可视化操作,同时不影响文档模型的灵活性。此外,数据分析师还可以使用SQL在Atlas集群和云对象存储中查询数据,无需进行任何数据操作、模式定义或扁平化处理。针对现代应用架构进行优化除了支持广泛的工作负载外,组织机构还需要灵活地部署合适的应用架构以满足需求。  • Atlas Serverless现已全面上市,用户可以在几乎不需要初始配置和持续容量管理的情况下,满足广泛的应用需求。用户可以在所有三大云计算供应商的平台中实现按需扩展或完全停用(scale-to-zero)操作和部署,而分级定价(tiered pricing)功能可免除前期投入,自动降低大型工作负载的成本。  • 借助Vercel integration功能,平常使用Vercel平台开发、预览和发布网站及应用程序的团队可以更轻松地将MongoDB Atlas作为后台数据库使用。借助Vercel Integrations Marketplace,开发者无需任何配置即可在Atlas上部署新的web体验,即刻开始使用直接映射到其代码的文档进行构建。• Cluster-to-Cluster Synchronization推动MongoDB集群在Atlas、私有云、本地环境、边缘等实现跨环境的持续数据同步。Cluster-to-Cluster Synchronization使用户能够轻松地将数据迁移到云端,创建测试环境,打造独有的分析环境,并满足数据驻留要求。• Atlas Device Sync可以将Atlas中完全托管式后端数据库连接至边缘和移动设备常用的移动端数据库Realm。MongoDB全新Flexible Sync选项通过直观的语言原生查询和分层权限,对同步到用户应用程序的数据进行精细化控制。  • Data API无需额外的开发,就可以通过HTTPS协议为Atlas中的数据提供安全的API访问服务。开发者可以借助这种方法轻松地将Atlas数据扩展到云端的其他应用程序及服务,或者扩展到他们的无服务器架构中。  Amadeus技术平台与工程(TPE)高级副总裁Sylvain Roy表示:“长期以来,我们一直希望当前基于MongoDB的旅游应用程序能够实现Cluster-to-Cluster Synchronization(C2C)功能,这将使我们受益匪浅。它将给我们软件生命周期的许多方面带来极大改善,例如支持‘蓝/绿’部署、数据分配、云迁移等,并进一步提升我们在不同地理位置为航空公司客户提供服务的能力。”  实现最精密的数据加密技术  所有组织机构都必须具备在各种环境中保护敏感信息的能力,同时不影响自身基于这些数据构建丰富应用体验的能力。现有动态和静态加密解决方案涵盖多种使用场景,但是没有一个方案既能完全地保护敏感数据,又能允许开发者灵活使用这些被保护的数据。MongoDB 6.0预览版推出了业界首个使用突破性密码学工程原理的加密搜索方案——Queryable Encryption。这项技术使开发者能够在不影响性能的情况下,简单直观地查询加密的敏感数据,并且不需要具备任何加密经验。数据库中的数据可以始终保持加密状态,包括存储在内存和CPU中的数据;密钥永远不会离开应用程序,且不能通过数据库服务器进行访问。这种端到端的客户端加密技术使用新颖的加密索引数据结构,使得开发者能够史无前例地在完全加密的机密数据上进行表达式查询。Queryable Encryption基于经过充分测试的、框架完善的标准NIST密码学原语,可提供强有力的保护,防止针对数据库发起的攻击,包括来自拥有很多特权的管理员以及云基础设施等人员的内部威胁。  
  • [行业资讯] 6 月数据库排行榜:Oracle、PG 和 MongoDB 分数上涨
    DB-Engines 数据库流行度排行榜发布了 6 月份的更新。可以看到,分数明显上涨的数据库包括 Oracle、PostgreSQL 和 MongoDB,其中 Oracle 分数上涨最多 —— 较上个月增加了 24.92 分。MySQL 和 Redis 的分数则略有下跌,尤其是 MySQL 的分数已连续下跌了两个月。下图是 TOP 10 数据库的最新分数和变化情况。排名方面,Snowflake 较上个月上升了 1 个名次,目前的排名是 13,看来有望进入前十。Snowflake 去年曾获得 “2021 年度数据库” 称号。继续看看主流数据库的分数趋势变化:最后看看各类型数据库的排名情况。关系数据库前 10 名Key-Value 数据库前 10 名文档数据库前 10 名时序数据库前 10 名图数据库前 10 名DB-Engines 根据流行度对数据库管理系统进行排名,排名每月更新一次。排名的数据依据 5 个不同的指标:Google 以及 Bing 搜索引擎的关键字搜索数量Google Trends 的搜索数量Indeed 网站中的职位搜索量LinkedIn 中提到关键字的个人资料数Stackoverflow 上相关的问题和关注者数量这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的。
  • [交流吐槽] 聊聊 MongoDB 时间序列集合
    名词解释bucket:带有相同的元数据且在一段有限制的间 隔区间内的测量值组。bucket collection :用于存储时序型集合的底层的分组桶的系统集合。复制、分片和索引都是在桶级别上完成的。measurement:带有特定时间序列的K-V集合。meta-data:时序序列里很少随时间变化的K-V对,同时可以用于识别整个时序序列。time-series:一段间隔内的一系列测量值。time-series collection:一种表示可写的非物化的视图的集合类型,它允许存储和查询多个时间序列,每个序列可以有不同的元数据。MongoDB 在5.0中支持了新的timeseries collection类型的选项,该类型用于存储时序型数据。timeseries collection提供了一组用于插入和查询测量值的简单接口,同时底层实际的数据是存储在以bucket形式的集合中。在创建timeseries collection时,timeField字段是最小必备的配置项。metaField是另一个可选的、可被指定的元数据字段,它是用于在bucket中对测量值分组的依据。MongoDB通过提供expireAfterSeconds字段选项,也支持了对测量值的过期机制。在mydb数据库中有个以mytscoll 命名的timeseries collection,该集合在MongoDB内部的catelog(用于存储集合或视图的信息)里是由一个视图和一个系统集合组成的。mydb.mytscoll 是个视图,它在MongoDB底层是用bucket collection作为包含特定属性的原始集合实现的:该视图就是通过aggregation里的$_internalUnpackBucket来实现展开bucket里数据的。该视图是可写的(仅支持插入)。同时每个被插入的文档必须包含时间字段。在查询视图时,它会隐式地展开底层在bucket collection中存储的数据,然后返回原始的非bucket形式的文档数据。该系统集合的命名空间是mydb.system.buckets.mytscoll,它是用来存储实际数据的。每一个在bucket collection里的文档,都表示了一组区间间隔的时序型数据。如果在创建timeseries collection时,定义了metaField元数据字段,那么所有在bucket里的测量值都会有这个通用的元数据字段。除了时间范围,bucket还限制了每个文档数据的总条数以及测量值的大小。Bucket Collection Schema{ _id: <Object ID with time component equal to control.min.<time field>>, control: { // <Some statistics on the measurements such min/max values of data fields> version: 1, // Version of bucket schema. Currently fixed at 1 since this is the // first iteration of time-series collections. min: { <time field>: <time of first measurement in this bucket, rounded down based on granularity>, <field0>: <minimum value of 'field0' across all measurements>, <field1>: <maximum value of 'field1' across all measurements>, ... }, max: { <time field>: <time of last measurement in this bucket>, <field0>: <maximum value of 'field0' across all measurements>, <field1>: <maximum value of 'field1' across all measurements>, ... }, closed: <bool> // Optional, signals the database that this document will not receive any // additional measurements. }, meta: <meta-data field (if specified at creation) value common to all measurements in this bucket>, data: { <time field>: { '0', <time of first measurement>, '1', <time of second measurement>, ... '<n-1>': <time of n-th measurement>, }, <field0>: { '0', <value of 'field0' in first measurement>, '1', <value of 'field0' in first measurement>, ... }, <field1>: { '0', <value of 'field1' in first measurement>, '1', <value of 'field1' in first measurement>, ... }, ... } }索引为了保证timeseries collection的查询可以受益于索引扫描而不是全表扫描,timeseries collection允许索引可以被创建在时间上,元数据上以及元数据的子属性上。从MongoDB5.2开始,在timeseries collection也允许索引被创建在测量值上。用户使用createIndex命令提供的索引规范被转换为底层buckets collection的模式。timeseries collection与底层的buckets collection之间的索引映射转换关系细节,你可以参考timeseries_index_schema_conversion_functions.h.在v5.2及以上版本的最新支持的索引类型,timeseries collection会存储用户原始的索引定义到变换后的索引定义上。当从底层的bucket collection的索引映射到timeseries collections的索引时,会返回用户原始的索引定义。当索引被创建后,可以通过listIndexes命令或$indexStats聚合计划来检查。listIndexes 和$indexStats是作用于timeseries collections的,执行时,它们会在内部将底层的bucket collection的索引转化成timeseries格式的索引,并返回。比如,当我们在元数据字段中定义有mm的timeseries collection上执行listIndexes命令时,底层的bucket collection的{meta:1}索引,将会以{mm:1}格式返回。dropIndex 和collMod (hidden: , expireAfterSeconds: ) 也同样支持在timeseries collection上。时间字段上支持的索引类型:单字段索引组合索引哈希索引通配符索引稀疏索引多键索引带排序的索引元数据字段和元数据子字段支持的索引类型:支持所有时间字段上支持的索引类型v5.2及以上版本支持2d 索引v5.2及以上版本支持2dsphere 索引v5.2及以上版本支持 Partial索引仅在v5.2及以上版本,测量值字段支持的索引类型:单字段索引组合索引2dsphere部分条件索引`timeseries collections 上不支持的索引类型,包括 唯一索引以及文本索引。桶目录为了保证高效地桶(分组)操作,我们在BucketCatalog里维护了一组开启的桶,你可以在bucket_catalog.h找到。在更高的级别,我们尝试着把并发写程序的写操作分组合并为可以一起提交地批处理,以减少对底层文档的写次数。写程序会插入它的输入批处理里的每一个文档到BucketCatalog,然后BucketCatalog会返回一个BucketCatalog::WriteBatch的处理器。一旦完成上面那些插入操作后,写程序就会检查每个写批处理。如果没有其他的写程序已经对批处理声明提交的权利,那么它会声明权利,并会提交它的批处理。否则,写程序将会稍后再提交处理。当它检查完所有的批处理,写程序将会等待其他的写程序提交每个剩下的批处理。在内部,BucketCatalog维护一组对每个bucket 文档的更新操作。当批处理被提交时,它会将这些插入转换到成buckets的列格式,并确保任何control字段的更新(例如control.min 和 control.max)。当bucket文档在没有通过BucketCatalog的情况下被更新时,写程序就需要为有问题的文档或命名空间去调用BucketCatalog::clear ,这样它就可以更新它的内部状态,避免写入任何可能破坏bucket 格式的数据。这通常由OP观察者处理,但可能需要通过其他地方去调用。bucket既可以通过手动设置选项control.closed 标识来关闭,也可以在许多场景下通过 BucketCatalog 自动关闭。如果BucketCatalog使用了超出给定的阈值(可通过服务器参数timeseriesIdleBucketExpiryMemoryUsageThreshold控制)的更多内存,此时它将会开始去关闭空闲的bucket。如果bucket是开启的且它没有任何未处于等待中未提交的测量值时,那么它就会被视为空闲的bucket。在下面这些场下 BucketCatalog 也会关闭bucket: 如果它拥有超过最大阈值(timeseriesBucketMaxCount)的测量值数据的数量;如果它拥有过大的数据量大小(timeseriesBucketMaxSize);又或者一个新的测量值数据是否是会导致bucket在其最旧的时间戳和最新的时间戳之间跨度比允许的间隔更长的时间(当前硬编码为一小时)。如果传入的测量值在原理上与已经到达给定bucket的度量不兼容,该bucket将被关闭,同时可以使用numBucketsClosedDueToSchemaChange度量进行跟踪。在第一次提交给定bucket的写批处理时,就会生成新的完整的文档。后续的批处理提交中,我们只执行更新操作,不再生成新的完整的文档(因此称为‘经典’更新),是直接创建DocDiff(“delta”或者v2的更新)。粒度timeseries collection的granularity 选项在集合创建的时候,可以被设置成seconds,minutes或者hours。后期可通过colMod操作来修改这个选项从seconds到minutes或者从minutes到hours,除此之外的转化修改目前都是不支持的。该参数想要表示在已给定的时序型测量数据之间的粗略的时间间隔,同时也用于调节其他内部参数对分组的影响。单个bucket被允许的最大时间跨度,是由granularity选项控制,对于seconds,最大的时间跨度被设置成1小时,对于minutes就是24小时,对于hours就是30天。当通过BucketCatalog开启新的bucket时,_id里的时间戳就是等同于control.min.的值,该值是从第一个插入bucket的测量数据中根据granularity选项来向下近似舍入而得到的。对于seconds,它将向下舍入到最接近的分钟,对于minutes,将向下舍入到最接近的小时,对于hours,它将向下舍入到最接近的日期。在闰秒和日历中的其他不规则情况下,这种舍入可能并不完美,并且通常通过对自纪元以来的秒数进行基本模运算来完成,假设每分钟 60 秒,每小时 60 分钟,以及每天 24 小时。更新和删除timeseries collection 支持符合以下限制的删除语句:仅支持metaField的属性的查询语句支持批量操作同时更新满足上面同样的条件,另外遵循:仅支持metaField对应的属性值更新操作指定一个带有更新运算符表达式的更新文档(而不是替换文档或者更新的pipeline操作)不支持upsert:true 操作这些更新与删除的执行都会被转换成相对应的底层的bucket collection的更新或删除操作。特别是,对于查询和更新文档,我们会使用真正的字段meta 替换集合的metaField。(参见 Bucket 集合规范)例如,对于一个使用 metaField: "tag"创建的timeseries集合db.ts,考虑一个对这个集合的更新操作,其查询语句是{"tag.tag.a": "a"} ,同时更新文档语句是 {$set: {"tag.tag.a": "A"}, $rename: {"tag.tag.b": "tag.tag.c"}}。这个更新操作在 db.system.buckets.ts上会被转换成,查询语句是{"meta.tag.a": "a"},更新语句是 {$set: {"meta.tag.a": "A"}, $rename: {"meta.tag.b": "meta.tag.c"}}。然后这个转换后的更新语句就可以像普通的更新操作一样执行。上面这些转换流程也适用于删除操作。参考文献MongoDB Blog: Time Series Data and MongoDB: Part 2 - Schema Design Best Practices关于作者:黄璜
  • [交流吐槽] Mysql和Mongodb应用场景
    MongoDB 的适用场景为:数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用 MongoDB , 其他情况就还是用 MySQL ,这样组合使用就可以达到最大的效率。1.如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么,这样的使用可能有以下几种情况的考量: (1)mongodb所负责部分以文档形式存储,能够有较好的代码亲和性,json格式的直接写入方便。(如日志之类) (2)从data models设计阶段就将原子性考虑于其中,无需事务之类的辅助。开发用如nodejs之类的语言来进行开发,对开发比较方便。 (3)mongodb本身的failover机制,无需使用如MHA之类的方式实现。2.将mongodb作为类似redis ,memcache来做缓存db,为mysql提供服务,或是后端日志收集分析。 考虑到mongodb属于nosql型数据库,sql语句与数据结构不如mysql那么亲和 ,也会有很多时候将mongodb做为辅助mysql而使用的类redis memcache 之类的缓存db来使用。 亦或是仅作日志收集分析。MongoDB 有一个最大的缺点,就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在 MongoDB 中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题。另外一个就是在一定的时间后,所占空间会莫明其妙地增大,所以要定期把数据库做修复,定期重新做索引,这样会提升MongoDB 的稳定性和效率。1.MySQL 来自女儿的名字; MongoDB 来自 humongous2.MySQL 使用 Table/Row/Column; MongoDB 使用 Collection/Document3.MySQL 需要指定 table 的 schema; MongoDB的 collection 的每个 document 的 schema 可以自由修改4.MySQL 支持 join; MongoDB 没有 join5.MySQL 使用 SQL 语言; MongoDB 使用类似 JavaScript 的函数命令对比MongoDB 与 MySQL 命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB 是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
  • [交流吐槽] MongoDB和Redis区别
    MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。指标 MongoDB(v2.4.9) Redis(v2.4.17) 比较说明实现语言 C++C/C++-协议BSON、自定义二进制类Telnet-性能依赖内存,TPS较高依赖内存,TPS非常高Redis优于MongoDB可操作性丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言数据丰富,较少的IOMongoDB优于Redis内存及存储适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)Redis2.0后增加虚拟内存特性,突破物理内存限制;数据可以设置时效性,类似于memcache不同的应用角度看,各有优势可用性支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决。(MongoDB 一般会使用replica sets和sharding功能结合,replica sets侧重高可用性及高可靠性,而sharding侧重于性能、易扩展)可靠性从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能MongoDB优于Redis一致性不支持事物,靠客户端自身保证支持事物,比较弱,仅能保证事物中的操作按顺序执行Redis优于MongoDB数据分析内置数据分析功能(mapreduce)不支持MongoDB优于Redis应用场景海量数据的访问效率提升较小数据量的性能及运算MongoDB优于Redis
  • [交流吐槽] mongodb有什么应用场景?
    请教,谢谢
  • [技术干货] 《2022 MongoDB 数据与创新报告》发布:复杂基础架构阻碍企业创新,数据成最大痛点
    近日,通用数据库平台 MongoDB 发布了《2022 MongoDB 数据与创新报告》,该调查报告是一项针对亚太地区 2,000 余名(包括中国 400 余名)开发者、IT 决策者等专业技术人士的详尽调研,展示了创新的重要性,以及阻碍创新的隐性负担。创新是当务之急,但时间却没有被用在刀刃上根据该调查报告,在中国,81%的受访者表示,数据处理是应用程序构建过程中最困难的环节,而在应用程序开发过程中面临的最大技术挑战则是处理不同格式的海量数据。尽管高达 92%的受访者认为定期构建新的应用程序和功能是企业获得长期成功的关键,但许多机构认为能真正用于创新的时间非常有限。受访的开发团队和 IT 决策者均表示,他们在现有数据、应用程序和基础设施维护方面所花费的时间(27%)与用于构建全新的增值功能或应用程序的时间(28%)基本相当。调查指出,47%的受访者认为其组织机构的数据架构较为复杂,61%的受访者认为这种复杂性是制约创新的主要因素。受访企业表示,无法创新所导致的最严重后果将是成本上升,及无法从数据洞察获得竞争优势。MongoDB 公司首席技术官 Mark Porter 表示:“纵观所有处于创新前沿的公司,我们会发现,这些公司并没有将创新外包给第三方。相反,这些组织机构的管理层深谙软件构建的复杂性,所以更加愿意为自己的开发团队配备有效的解决方案,帮助他们提高效率。而我们的调查结果与从企业高管处获悉的信息是一致的。企业正因为使用复杂的遗留技术而让开发团队的工作受到影响。负责数字化转型项目的企业高管应该聚焦于如何尽快部署应用程序、更快地迭代,以及有效安排发布排期。”对于多数企业而言,上云和数字化转型增加了复杂性大多数机构(58%)认为数字化转型使其数据架构变得更加复杂。然而,在谈到上云时,一些公司显然有着不同的体验。45%的受访者表示,迁移到云端有助于简化其数据架构,而 36%的受访者则表示,上云实际使其数据架构变得更加复杂。遗留数据基础设施被视为另一个创新制约因素,59%的受访者表示其阻碍了创新技术的发展。随着对现代应用需求的日益增长,诸如搜索功能或移动应用程序等更多内容被陆续添加,这会导致整体构架随之臃肿。例如,31%的企业称其数据库数量多达 10 个以上。这意味着,开发人员需要花时间维护不同的多个数据模型、集成数据源、支持遗留系统及安全修复等方面。MongoDB 北亚区副总裁苏玉龙表示:“从调查中可以清楚地看出,并非所有企业都能享受到云带来的各种益处。许多机构只是将现有的基础架构迁移至云平台,再一步一步添加新服务,致使本地存在的问题在云平台上还是一样会存在。企业应该采取不同的方法。我们注意到,一些最具创新性的企业对应用平台进行战略性投资,从根本上改善四大关键领域,1)提高开发人员效率,2)优先考虑使用优质且可重复使用的架构,3)轻松实现数据安全与隐私保护,以及 4)采用既具有部署灵活性又侧重于多云模式的方法。”该调查报告得出的结论还包括:• 创新的首要任务是提高内部效率/生产力• 造成数据复杂性的最大因素是开发新产品或新功能的压力• 最大的技术挑战是处理不同格式的海量数据文章来源:https://www.infoq.cn/article/0Yu28kOQpiuXIsZ1pKa1?utm_source=rss&utm_medium=article
  • [技术干货] MongoDB 5.3.1 for openEuler 22.03 LTS 迁移指南
    #### 环境要求 | 项目 | 说明 | | ------ | :---------------------------- | | 服务器 | TaiShan 200服务器(型号2280) | | CPU | 华为鲲鹏920处理器 | | 硬盘 | 空间尽量大,至少100G。 | | 网络 | 通外网,有在线yum源和pip源。 | #### 操作系统 | 项目 | 版本 | 备注 | | ----------------- | --------- | ------------------ | | openEuler release | 22.03 LTS | cat /etc/*-release | #### 软件依赖 | 软件 | 版本 | | ------- | ------ | | gcc | 10.3.0 | | g++ | 10.3.0 | | python | 3.9 | | mongodb | 5.3.1 | #### 环境配置 ##### 配置python pip源 安装pip ```shell yum install python-pip ``` 创建.pip目录 ```shell mkdir -p ~/.pip ``` 创建 `pip.conf` 文件 ```shell vim pip.conf ``` 填写如下配置(华为pip镜像) ```ini [global] timeout=60 trusted-host=cmc-cd-mirror.rnd.huawei.com index-url=http://cmc-cd-mirror.rnd.huawei.com/pypi/simple/ ``` #### 安装依赖 ##### 安装编译工具 ```shell yum install -y tar zip unzip gzip gcc gcc-c++ make python cmake \ libcurl-devel openssl-devel python-pip ``` #### 编译安装 ##### 下载源码 ```shell git clone https://github.com/mongodb/mongo.git ``` ##### 进入源码目录 ```shell cd /home/mongo-r5.3.1 ``` ##### 安装python依赖 ```shell python3 -m pip install -r etc/pip/compile-requirements.txt ``` ##### 编译全部内容 ```shell python buildscripts/scons.py MONGO_VERSION=5.3.1 DESTDIR=/home/mongo --disable-warnings-as-errors CFLAGS="-march=armv8-a+crc" install-all-meta -j48 ``` 1. 报错 `Couldn't find OpenSSL crypto.h header and library` 解决:安装 `openssl-devel` ```shell yum install -y openssl-devel ``` ##### 给mongodb的可执行文件创建软链接 ```shell ln -s /home/mongo/bin/mongo /usr/bin/mongo ln -s /home/mongo/bin/mongod /usr/bin/mongod ``` ##### 运行单元测试 ```shell cd /home/mongo/bin # 列出所有单元测试 ./dbtest -l # 运行单个测试 ./dbtest query_plan_ranking ``` #### 启动MongoDB ##### 防火墙配置 开放27017端口 ```shell # 暂时开放27017端口 firewall-cmd --add-port=27017/tcp # 永久开放27017端口 firewall-cmd --permanent --add-port=27017/tcp # 重启防火墙 firewall-cmd --reload ``` 或者可以直接关闭防火墙 ```shell # 暂时关闭防火墙 systemctl stop firewalld # 永久关闭防火墙 systemctl disable firewalld ``` ##### 创建相关目录 ```shell # 数据目录 mkdir -p /var/lib/mongo # 日志目录 mkdir -p /var/log/mongodb ``` ##### 前台运行 ```shell # 使用root前台运行 mongod --dbpath=/var/lib/mongo --bind_ip=0.0.0.0 --port 27017 ``` ##### 后台运行 ```shell # 使用root后台运行 mongod --dbpath=/var/lib/mongo --fork --bind_ip=0.0.0.0 --port 27017 \ --logpath=/var/log/mongodb/mongodb.log --logappend ``` ##### 使用配置文件运行 ```shell # 拷一份配置文件 cp rpm/mongod.conf /etc/mongod.conf # 使用root运行 mongod -f /etc/mongod.conf ``` #### 配置用户、配置文件、权限 ##### 创建用户和组 ```shell useradd mongod ``` ##### 安装目录授权给 mongod ```shell chown -R mongod:mongod /home/mongo ``` ##### 创建日志目录并授权 ```shell rm -rf /var/log/mongodb mkdir -p /var/log/mongodb chown -R mongod:mongod /var/log/mongodb ``` ##### 创建数据目录并授权 ```shell rm -rf /var/lib/mongo mkdir -p /var/lib/mongo chown -R mongod:mongod /var/lib/mongo ``` ##### 创建pid目录 ```shell rm -rf /var/run/mongodb mkdir -p /var/run/mongodb chown -R mongod:mongod /var/run/mongodb ``` ##### 创建配置文件并授权 ```shell # 拷一份默认配置文件 cp rpm/mongod.conf /etc/mongod.conf ``` ##### 按需修改配置文件 ```yaml # network interfaces net: port: 27017 # 这里修改为0.0.0.0,否则外部无法访问 bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting. ``` ##### 拷贝一份环境变量文件 ```shell cp rpm/mongod.sysconfig /etc/sysconfig/mongod ``` ##### 修改权限 ```shell chown mongod:mongod /etc/sysconfig/mongod ``` #### 配置服务 ##### 复制一份服务脚本 ```shell cp rpm/init.d-mongod /etc/rc.d/init.d/mongod ``` ##### 添加可执行权限 ```shell chmod 755 /etc/rc.d/init.d/mongod ``` ##### 启动服务 ```shell /etc/rc.d/init.d/mongod start ``` ##### 加入开机启动服务列表 ```shell chkconfig --add mongod # 查看开机自启服务 chkconfig --list ``` ##### 启动服务 ```shell # 重新加载配置文件 systemctl daemon-reload # 启用mongod systemctl enable mongod # 启动mongod systemctl start mongod # 查看状态 systemctl status mongod ```
  • [技术干货] MongoDB 5.3增强时序数据能力
    MongoDB 5.3版本发布,为该数据库平台的用户提供了新功能,可帮助改进时间序列数据支持。 MongoDB是一个基于JSON的NoSQL文档数据库。近年来,MongoDB越来越多地支持额外的数据模型,成为所谓的多模型数据库。随着2021年7月推出的MongoDB 5.0数据库,该数据库供应商引入了时间序列数据支持。自MongoDB 5.0首次发布以来的几个月里,该公司发布了多个更新,作为其季度发布周期的一部分。在1月21日发布的MongoDB 5.2中,添加了可以帮助处理时间序列数据的新数据查询功能。 随着MongoDB 5.3的推出,时间序列数据再次成为更新的主要焦点,围绕着称为填充空白的特性提供了一组新功能。在时间序列数据中,传输数据的设备或传感器有时可能存在间隙。然后,这些差距可能会给依赖于数据库中连续数据条目的数据分析和运营用例带来挑战。填补空白提供了一组数据库方法来真正填补空白。 IDC公司分析师Carl Olofson解释说:“如果需要一个全面的时间序列API,填补空白是根本。”在MongoDB 5.3中,为什么对时序数据的空白填充很重要根据Olofson的说法,用户通常不仅会将数据移植到专门的时间序列数据集,而且还会使用组合工具来检查数据、检测空白、填补它们并进行分析。他说,在他看来,MongoDB 的承诺是,用户将有办法更容易有效利用时间序列数据。 填补空白的过程可能很棘手。Olofson指出,可以使用多种技术,具体取决于多个因素,例如值序列是否遵循可检测模式或看起来是随机,或者取决于其他一些因素。 Olofson 称:“我认为,对于创建可靠的数据平台,MongoDB包含填补空白很有必要,在这个平台上,一切都准备就绪,可用于进行可靠的时间序列分析。” MongoDB 5.3为用户提供了一系列空白填充功能,包括为缺失数据添加新条目的$densify和提供适当值的$fill。数据支持与MongoDB 5.3 MongoDB使用两种特定技术来启用空白填充,即$densify和$fill命令。 通过使用$densify,数据库为来自时间序列数据源(例如传感器)的缺失条目创建新文档。然后$fill命令为新条目提供实际值或数据。MongoDB开发者体验总监Jane Fine解释说,可以使用三种方法来填补空白:常量值、线性插值或将最后一个事件向前推进。 Fine称:“在绘制或分析时间序列数据时,填补空白是一个非常重要的工具。” MongoDB的下一个版本预计将是一次重大更新,将于6月推出MongoDB 6.0。下一次更新的功能包括一系列增强的安全功能,包括对用于加密密钥管理的密钥管理互操作性协议的增强支持。 来源:TechTarget中国
  • [技术干货] MongoDB 4.4.0(aarch64)编译指导 for openEuler 20.03 LTS SP1
    1 简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。官方链接: https://www.mongodb.com/类别:数据库语言:C++/JavaScript/Python/2 环境类别子项版本获取地址(方法) 硬件CPUIntel 5218iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSopenEuler20.03 LTS SP1cat /etc/os-releaseKernel4.19.90cat /proc/version软件GCC9.3.1参考下面安装说明 gcc -vOpenJDK 1.8.0_272参考下面安装说明MongoDB4.4.0参考下面安装说明3 系统依赖安装3.1 配置本地yum源挂载OS镜像:mount -o loop /home/openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /mnt/iso/执行mv /etc/yum.repos.d /etc/yum.repos.d.bak备份默认yum源,然后mkdir /etc/yum.repos.d/创建/etc/yum.repos.d/路径,执行vim /etc/yum.repos.d/local.repo文件,配置yum本地源:[local]name=localbaseurl= file:///mnt/isogpgcheck=0enabled=1运行下面的命令,使yum源配置生效:yum clean allyum makecache3.2 安装GCC等相关依赖yum安装GCC、Python3等相关依赖:sudo yum install -y snappy snappy-devel autoconf automake libtool git gcc* make cmake openssl openssl-devel zlib zlib-devel bzip2 bzip2-devel bzip2-libs readline readline-devel bison zip unzip tar tcl java-1.8.0* bison* ncurses* wget libyaml libyaml-devel python-setuptools libcurl-devel python-devel gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel libpcap-dev* python3*4 编译依赖安装4.1 安装Kunpeng gcc 9.3.1注:MongoDB 4.4.0编译依赖8.2.0及更新版本的gcc,需要先升级gcc版本到8.2.0或以上版本;1、下载Kunpeng gcc-9.3.1二进制包wget https://mirror.iscas.ac.cn/kunpeng/archive/compiler/kunpeng_gcc/gcc-9.3.1-2021.03-aarch64-linux.tar.gztar zxvf gcc-9.3.1-2021.03-aarch64-linux.tar.gz注:如果系统环境无法联网,则手动点击https://mirror.iscas.ac.cn/kunpeng/archive/compiler/kunpeng_gcc/gcc-9.3.1-2021.03-aarch64-linux.tar.gz下载gcc-9.3.1-2021.03-aarch64-linux.tar.gz后传到系统/home/路径下。2、进入解压目录cd gcc-9.3.1-2021.03-aarch64-linux/3、配置环境变量,在/etc/profile文件其末尾添加如下内容:export PATH=/home/gcc-9.3.1-2021.03-aarch64-linux/bin:$PATHexport INCLUDE=/home/gcc-9.3.1-2021.03-aarch64-linux/include:$INCLUDEexport LD_LIBRARY_PATH=/home/gcc-9.3.1-2021.03-aarch64-linux/lib64:$LD_LIBRARY_PATH【注】:执行source /etc/profile使环境变量生效;4、查看gcc版本gcc -v5、备份系统自带gcc版本的gcc、g++和c++mv /usr/bin/gcc /usr/bin/gcc.bakmv /usr/bin/g++ /usr/bin/g++.bakmv /usr/bin/c++ /usr/bin/c++.bak6、创建Kunpeng gcc的gcc、g++、c++、cc、cc1和libstdc++.so.6软链接ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/gcc /usr/bin/gccln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/g++ /usr/bin/g++ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/c++ /usr/bin/c++ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/gcc /usr/bin/ccln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/libexec/gcc/aarch64-linux-gnu/9.3.1/cc1 /usr/bin/cc1 4.2 编译安装cython1、进入/hom目录获取cython源码cd /home/git clone https://github.com/cython/cython.git注:如果系统环境无法联网,则手动单击链接https://github.com/cython/cython.git打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装cypthoncd /home/cythonpython3 setup.py install注:系统环境无法联网情况下,执行如下命令安装cypthonunzip cython-master.zipcd /home/cython-masterpython3 setup.py install4.3 编译安装pyyaml1、进入/hom目录获取pyyaml源码cd /home/git clone https://github.com/yaml/pyyaml.git注:如果系统环境无法联网,则手动单击链接https://github.com/yaml/pyyaml.git打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装pyyamlcd /home/pyyamlpython3 setup.py install注:系统环境无法联网情况下,执行如下命令安装pyyamlunzip pyyaml-master.zipcd /home/pyyaml-masterpython3 setup.py install4.4 编译安装typing 3.10.0.01、进入/hom目录获取typing 3.10.0.0源码cd /home/wget https://files.pythonhosted.org/packages/b0/1b/835d4431805939d2996f8772aca1d2313a57e8860fec0e48e8e7dfe3a477/typing-3.10.0.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/b0/1b/835d4431805939d2996f8772aca1d2313a57e8860fec0e48e8e7dfe3a477/typing-3.10.0.0.tar.gz载typing-3.10.0.0.tar.gz并上传到系统的/home/目录下。2、安装typing 3.10.0.0tar xf typing-3.10.0.0.tar.gzcd /home/typing-3.10.0.0python3 setup.py install4.5 编译安装cheetah31、进入/hom目录获取cheetah3源码cd /home/git clone https://github.com/CheetahTemplate3/cheetah3.git注:如果系统环境无法联网,则手动单击链接https://github.com/CheetahTemplate3/cheetah3.git打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装cheetah3cd /home/cheetah3python3 setup.py install注:系统环境无法联网情况下,执行如下命令安装cheetah3unzip cheetah3-master.zipcd /home/cheetah3-masterpython3 setup.py install4.6 编译安装psutil 5.8.01、进入/hom目录获取psutil 5.8.0源码cd /home/wget https://files.pythonhosted.org/packages/e1/b0/7276de53321c12981717490516b7e612364f2cb372ee8901bd4a66a000d7/psutil-5.8.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/e1/b0/7276de53321c12981717490516b7e612364f2cb372ee8901bd4a66a000d7/psutil-5.8.0.tar.gz下载psutil-5.8.0.tar.gz并上传到系统的/home/目录下。2、安装psutil 5.8.0tar xf psutil-5.8.0.tar.gzcd /home/psutil-5.8.0python3 setup.py install4.7 编译安装pymongo 4.0.11、进入/hom目录获取pymongo 4.0.1源码cd /home/wget https://files.pythonhosted.org/packages/3f/ff/7ec17064d403799d644f7db9c2e99202441849aebe771efe3199f3dd9076/pymongo-4.0.1.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/3f/ff/7ec17064d403799d644f7db9c2e99202441849aebe771efe3199f3dd9076/pymongo-4.0.1.tar.gz下载pymongo-4.0.1.tar.gz并上传到系统的/home/目录下。2、安装pymongo 4.0.1tar xf pymongo-4.0.1.tar.gzcd /home/pymongo-4.0.1python3 setup.py install4.8 编译安装pathlib 1.0.11、进入/hom目录获取pathlib 1.0.1源码cd /home/wget https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz下载pathlib-1.0.1.tar.gz并上传到系统的/home/目录下。2、安装pathlib 1.0.1tar xf pathlib-1.0.1.tar.gzcd /home/pathlib-1.0.1python3 setup.py install4.9 编译安装pathlib2 2.3.61、进入/hom目录获取pathlib2 2.3.6源码cd /home/wget https://files.pythonhosted.org/packages/df/16/e9d6bcf1aed52a55bc1696324ab22586716053b3e97b85266e0f3ad36bae/pathlib2-2.3.6.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/df/16/e9d6bcf1aed52a55bc1696324ab22586716053b3e97b85266e0f3ad36bae/pathlib2-2.3.6.tar.gz下载pathlib2-2.3.6.tar.gz并上传到系统的/home/目录下。2、安装pathlib2 2.3.6tar xf pathlib2-2.3.6.tar.gzcd /home/pathlib2-2.3.6python3 setup.py install4.10 编译安装scandir 1.10.01、进入/hom目录获取scandir 1.10.0源码cd /home/wget https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz下载scandir-1.10.0.tar.gz并上传到系统的/home/目录下。2、安装scandir 1.10.0tar xf scandir-1.10.0.tar.gzcd /home/scandir-1.10.0python3 setup.py install4.11 编译安装regex 2021.11.101、进入/hom目录获取regex 2021.11.10源码cd /home/wget https://files.pythonhosted.org/packages/97/cd/93ad08b2f97ec95da0bd860380ce0ac7481eaccc760356ee11eda369c048/regex-2021.11.10.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/97/cd/93ad08b2f97ec95da0bd860380ce0ac7481eaccc760356ee11eda369c048/regex-2021.11.10.tar.gz下载regex-2021.11.10.tar.gz并上传到系统的/home/目录下。2、安装regex 2021.11.10tar xf regex-2021.11.10.tar.gzcd /home/regex-2021.11.10python3 setup.py install4.12 编译安装Scons 4.3.01、进入/hom目录获取Scons 4.3.0源码cd /home/wget https://files.pythonhosted.org/packages/64/a1/9dc5c5e43b3d1b1832da34c8ae7b239a8f2847c33509fa0eb011fd8bc1ad/SCons-4.3.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/64/a1/9dc5c5e43b3d1b1832da34c8ae7b239a8f2847c33509fa0eb011fd8bc1ad/SCons-4.3.0.tar.gz下载SCons-4.3.0.tar.gz并上传到系统的/home/目录下。2、安装Scons 4.3.0tar xf SCons-4.3.0.tar.gzcd /home/SCons-4.3.0python3 setup.py install  5 编译安装1、下载MongoDB 4.4.0源码wget https://github.com/mongodb/mongo/archive/r4.4.0.tar.gz -O mongo-r4.4.0.tar.gztar xf mongo-r4.4.0.tar.gz注:如果系统环境无法联网,则手动点击https://github.com/mongodb/mongo/archive/r4.4.0.tar.gz下载mongo-r4.4.0.tar.gz后传到系统/home/路径下。2、进入解压目录cd mongo-r4.4.0/3、安装python依赖python3 -m pip install -r etc/pip/compile-requirements.txt4、创建MongoDB安装路径并执行编译(编译安装路径空间需要大于500G)mkdir -p /home/local/mongopython3 buildscripts/scons.py MONGO_VERSION=4.4.0 install-all CFLAGS="-march=armv8-a+crc -mtune=generic" -j64 DESTDIR=/home/local/mongo --disable-warnings-as-errors5、查看编译后路径cd /home/local/mongo/6、删除调试信息并查看编译后的二进制文件cd bin/strip mongosstrip mongodstrip mongo  6 验证1、查看MongoDB版本/home/local/mongo/bin/mongod --version2、创建dbpath路径并启动MongoDB数据库mkdir -p /data/db./mongod &3、查看数据库进程是否正常启动ps -ef | grep mongod4、登录mongodb数据库并查看当前存在的数据库./mongoshow dbs5、退出数据库并查看dbpath文件exitls /data/db/  7 参考信息1、https://www.cnblogs.com/hiyang/p/13560493.html2、https://support.huaweicloud.com/prtg-kunpengdbs/kunpengmongodb_02_0012.html3、https://github.com/mongodb/mongo/blob/master/docs/building.md  8 FAQ1、执行./mongod启动MongoDB失败,报“/data/db not found”错误【详细描述】:执行./mongod启动MongoDB失败,报“/data/db not found”错误,具体报错如下:解答:执行mkdir -p /data/db命令创建dbpath路径,再次执行./mongod &启动MongoDB数据库。
  • [技术干货] 鲲鹏上编译mongodb 4.4版本报build arm64/crc32-arm64.o failed: Error解决方法
    【问题描述】鲲鹏上编译mongodb 4.4版本报build/opt/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.o failed: Error 1错误,详细报错如下:scons: *** [build/opt/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.o] Error 1scons: building terminated because of errors.build/opt/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.o failed: Error 1【解决方法】在编译命令中增加CFLAGS="-march=armv8-a+crc -mtune=generic",详细命令参考如下:python3 buildscripts/scons.py MONGO_VERSION=4.4.0 install-all CFLAGS="-march=armv8-a+crc -mtune=generic" -j64 DESTDIR=/home/local/mongo --disable-warnings-as-errors
  • [技术干货] MongoDB使用场景总结
    很多人比较关心 MongoDB 的适用场景,也有用户在话题里分享了自己的业务场景,比如案例1用在应用服务器的日志记录,查找起来比文本灵活,导出也很方便。也是给应用练手,从外围系统开始使用MongoDB。• 用在一些第三方信息的获取或者抓取,因为MongoDB的schema-less,所有格式灵活,不用为了各种格式不一样的信息专门设计统一的格式,极大的减少开发的工作。案例2mongodb之前有用过,主要用来存储一些监控数据,No schema 对开发人员来说,真的很方便,增加字段不用改表结构,而且学习成本极低。案例3使用MongoDB做了O2O快递应用,·将送快递骑手、快递商家的信息(包含位置信息)存储在 MongoDB,然后通过 MongoDB 的地理位置查询,这样很方便的实现了查找附近的商家、骑手等功能,使得快递骑手能就近接单,目前在使用MongoDB 上没遇到啥大的问题,官网的文档比较详细,很给力。经常跟一些同学讨论 MongoDB 业务场景时,会听到类似『你这个场景 mysql 也能解决,没必要一定用 MongoDB』的声音,的确,并没有某个业务场景必须要使用 MongoDB才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题(包括学习、开发、运维等成本),下面是 MongoDB 的主要特性,大家可以对照自己的业务需求看看,匹配的越多,用 MongoDB 就越合适。MongoDB 特性优势事务支持MongoDB 目前只支持单文档事务,需要复杂事务支持的场景暂时不适合灵活的文档模型JSON 格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代高可用复制集满足数据高可靠、服务高可用的需求,运维简单,故障自动切换可扩展分片集群海量数据存储,服务能力水平扩展高性能mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求强大的索引支持地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求Gridfs解决文件存储的需求aggregation & mapreduce解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到 MongoDB 上完成从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。• 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新• 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。• 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能• 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析• 视频直播,使用 MongoDB 存储用户信息、礼物信息等• ......如果你还在为是否应该使用 MongoDB,不如来做几个选择题来辅助决策(注:以下内容改编自 MongoDB 公司 TJ 同学的某次公开技术分享)。应用特征Yes / No应用不需要事务及复杂 join 支持必须 Yes新应用,需求会变,数据模型无法确定,想快速迭代开发?应用需要2000-3000以上的读写QPS(更高也可以)?应用需要TB甚至 PB 级别数据存储?应用发展迅速,需要能快速水平扩展?应用要求存储的数据不丢失?应用需要99.999%高可用?应用需要大量的地理位置查询、文本查询?如果上述有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择MongoDB绝不会后悔。到此这篇关于MongoDB使用场景总结的文章就介绍到这了。转载自https://www.jb51.net/article/238542.htm
  • [技术干货] SpringBoot 整合mongoDB并自定义连接池的示例代码
    得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它可以很容易的操作mongoDB数据库。为了自定义连接池,我们在配置类中主要与MongoClientOptions、MongoCredential、MongoClient、MongoDbFactory打交道。最终的目的就是配置好一个MongoDbFactory的bean交由Spring管理。Maven 依赖1234<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>配置文件123456789101112131415161718192021mongodb:  database: bfa_mongo  username: "xxx"  password: "xxxxx"  address: "host:port"  authenticationDatabase: [设置你的认证数据库,如果有的话]  # 连接池配置  clientName: ${spring.application.name} # 客户端的标识,用于定位请求来源等  connectionTimeoutMs: 10000     # TCP连接超时,毫秒  readTimeoutMs: 15000       # TCP读取超时,毫秒  poolMaxWaitTimeMs: 3000        #当连接池无可用连接时客户端阻塞等待的时长,单位毫秒  connectionMaxIdleTimeMs: 60000   #TCP连接闲置时间,单位毫秒  connectionMaxLifeTimeMs: 120000    #TCP连接最多可以使用多久,单位毫秒  heartbeatFrequencyMs: 20000      #心跳检测发送频率,单位毫秒  minHeartbeatFrequencyMs: 8000    #最小的心跳检测发送频率,单位毫秒  heartbeatConnectionTimeoutMs: 10000  #心跳检测TCP连接超时,单位毫秒  heartbeatReadTimeoutMs: 15000    #心跳检测TCP连接读取超时,单位毫秒  connectionsPerHost: 20       # 每个host的TCP连接数  minConnectionsPerHost: 5     #每个host的最小TCP连接数  #计算允许多少个线程阻塞等待可用TCP连接时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,当前配置允许10*20个线程阻塞  threadsAllowedToBlockForConnectionMultiplier: 10注意:其中的address参数可以配置为一个数组(代表集群模式)123address:    - "host:port"   - "host2:port2"MongoConfig配置类配置类中使用了lombok,如果你没有用lombok依赖和IDE插件,你要重写getter、Setter方法:代码稍长,可以复制在IDEA中查看:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163import com.mongodb.MongoClient;import com.mongodb.MongoClientOptions;import com.mongodb.MongoCredential;import com.mongodb.ServerAddress;import lombok.Getter;import lombok.Setter;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.BeanFactory;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.data.mongodb.MongoDbFactory;import org.springframework.data.mongodb.core.SimpleMongoDbFactory;import org.springframework.data.mongodb.core.convert.DbRefResolver;import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;import org.springframework.data.mongodb.core.convert.MappingMongoConverter;import org.springframework.data.mongodb.core.convert.MongoCustomConversions;import org.springframework.data.mongodb.core.mapping.MongoMappingContext;import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import java.util.ArrayList;import java.util.Arrays;import java.util.List; @Slf4j@Configuration@EnableConfigurationProperties(MongoConfig.MongoClientOptionProperties.class)public class MongoConfig {     /**     * monogo 转换器     * @return     */    @Bean    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory,                                                       MongoMappingContext context, BeanFactory beanFactory, MongoCustomConversions conversions) {        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);        // remove _class field//    mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));        mappingConverter.setCustomConversions(conversions);        return mappingConverter;    }     /**     * 自定义mongo连接池     * @param properties     * @return     */    @Bean    public MongoDbFactory mongoDbFactory(MongoClientOptionProperties properties) {        //创建客户端参数        MongoClientOptions options = mongoClientOptions(properties);         //创建客户端和Factory        List<ServerAddress> serverAddresses = new ArrayList<>();        for (String address : properties.getAddress()) {            String[] hostAndPort = address.split(":");            String host = hostAndPort[0];            Integer port = Integer.parseInt(hostAndPort[1]);            ServerAddress serverAddress = new ServerAddress(host, port);            serverAddresses.add(serverAddress);        }         //创建认证客户端        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(),                properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(),                properties.getPassword().toCharArray());         MongoClient mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options);        //集群模式        if (serverAddresses.size() > 1) {            mongoClient = new MongoClient(serverAddresses, new ArrayList<>(Arrays.asList(mongoCredential)));        }        /** ps: 创建非认证客户端*/        //MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);        return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());    }     /**     * mongo客户端参数配置     * @return     */    public MongoClientOptions mongoClientOptions(MongoClientOptionProperties properties) {        return MongoClientOptions.builder()                .connectTimeout(properties.getConnectionTimeoutMs())                .socketTimeout(properties.getReadTimeoutMs()).applicationName(properties.getClientName())                .heartbeatConnectTimeout(properties.getHeartbeatConnectionTimeoutMs())                .heartbeatSocketTimeout(properties.getHeartbeatReadTimeoutMs())                .heartbeatFrequency(properties.getHeartbeatFrequencyMs())                .minHeartbeatFrequency(properties.getMinHeartbeatFrequencyMs())                .maxConnectionIdleTime(properties.getConnectionMaxIdleTimeMs())                .maxConnectionLifeTime(properties.getConnectionMaxLifeTimeMs())                .maxWaitTime(properties.getPoolMaxWaitTimeMs())                .connectionsPerHost(properties.getConnectionsPerHost())                .threadsAllowedToBlockForConnectionMultiplier(                        properties.getThreadsAllowedToBlockForConnectionMultiplier())                .minConnectionsPerHost(properties.getMinConnectionsPerHost()).build();    }     @Getter    @Setter    @Validated    @ConfigurationProperties(prefix = "mongodb")    public static class MongoClientOptionProperties {         /** 基础连接参数 */        private String database;        private String username;        private String password;        @NotNull        private List<String> address;        private String authenticationDatabase;         /** 客户端连接池参数 */        @NotNull        @Size(min = 1)        private String clientName;        /** socket连接超时时间 */        @Min(value = 1)        private int connectionTimeoutMs;        /** socket读取超时时间 */        @Min(value = 1)        private int readTimeoutMs;        /** 连接池获取链接等待时间 */        @Min(value = 1)        private int poolMaxWaitTimeMs;        /** 连接闲置时间 */        @Min(value = 1)        private int connectionMaxIdleTimeMs;        /** 连接最多可以使用多久 */        @Min(value = 1)        private int connectionMaxLifeTimeMs;        /** 心跳检测发送频率 */        @Min(value = 2000)        private int heartbeatFrequencyMs;         /** 最小的心跳检测发送频率 */        @Min(value = 300)        private int minHeartbeatFrequencyMs;        /** 计算允许多少个线程阻塞等待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */        @Min(value = 1)        private int threadsAllowedToBlockForConnectionMultiplier;        /** 心跳检测连接超时时间 */        @Min(value = 200)        private int heartbeatConnectionTimeoutMs;        /** 心跳检测读取超时时间 */        @Min(value = 200)        private int heartbeatReadTimeoutMs;         /** 每个host最大连接数 */        @Min(value = 1)        private int connectionsPerHost;        /** 每个host的最小连接数 */        @Min(value = 1)        private int minConnectionsPerHost;    }}MappingMongoConverter可以自定义mongo转换器,主要自定义存取mongo数据时的一些操作,例如 mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)) 方法会将mongo数据中的_class字段去掉。最后通过 new SimpleMongoDbFactory(mongoClient, properties.getDatabase())方法配置了一个MongoDbFactory交由Spring管理,Springboot会拿这个MongoDbFactory工厂bean来new一个MongoTemplate,在MongoDbFactoryDependentConfiguration类下可以看到SpringBoot帮你做得事:1234567891011121314151617181920212223242526272829/** * Configuration for Mongo-related beans that depend on a {@link MongoDbFactory}. * * @author Andy Wilkinson */@Configuration@ConditionalOnBean(MongoDbFactory.class)class MongoDbFactoryDependentConfiguration {     private final MongoProperties properties;    MongoDbFactoryDependentConfiguration(MongoProperties properties) {        this.properties = properties;    }         //SpringBoot创建MongoTemplate实例    @Bean    @ConditionalOnMissingBean    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {        return new MongoTemplate(mongoDbFactory, converter);    @ConditionalOnMissingBean(MongoConverter.class)    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,            MongoCustomConversions conversions) {        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);        mappingConverter.setCustomConversions(conversions);        return mappingConverter;         //...}SpringBoot利用我们配置好的MongoDbFactory在配置类中生成一个MongoTemplate,之后我们就可以在项目代码中直接@Autowired了。因为用于生成MongoTemplate的MongoDbFactory是我们自己在MongoConfig配置类中生成的,所以我们自定义的连接池参数也就生效了。到此这篇关于SpringBoot 整合mongoDB并自定义连接池的文章就介绍到这了转载自https://www.jb51.net/article/238879.htm
  • [技术干货] 华为云鲲鹏论坛2月热门问题汇总
    1.【openeuler】【pip功能】pip安装后无法使用 https://bbs.huaweicloud.com/forum/thread-180443-1-1.html 2.【鲲鹏架构】【安装mongodb】按照指导配置编译环境pyyaml,安装时报错 https://bbs.huaweicloud.com/forum/thread-176464-1-1.html 3.【弹性云服务器ECS】【yum安装.net】安装.net失败 https://bbs.huaweicloud.com/forum/thread-180476-1-1.html 4.【openeuler产品】【uwsgi功能】安装uwsgi失败 https://bbs.huaweicloud.com/forum/thread-180526-1-1.html 5.【送餐机器人产品】【底座功能】请教寻求送餐机器人底座核心模块 https://bbs.huaweicloud.com/forum/thread-180340-1-1.html 6.【中标麒麟】程序无法daemon运行 https://bbs.huaweicloud.com/forum/thread-180495-1-1.html 7.web挂在鲲鹏服务器上半小时左右就访问不了了,端口也关闭了,这是怎么回事 https://bbs.huaweicloud.com/forum/thread-180399-1-1.html 8.【鲲鹏920产品】【国密nginx功能】银河麒麟系统+鲲鹏920能实现国密nginx吗?求教程 https://bbs.huaweicloud.com/forum/thread-180263-1-1.html 9.鲲鹏云服务器上strcpy函数计算有问题,结果不对 https://bbs.huaweicloud.com/forum/thread-180199-1-1.html 10.鲲鹏服务器上无法安装superset https://bbs.huaweicloud.com/forum/thread-180012-1-1.html 11.【鲲鹏PC产品】【鲲鹏服务器开发】可以在鲲鹏PC开发,后部署在鲲鹏服务器上运行吗? https://bbs.huaweicloud.com/forum/thread-179855-1-1.html 12.【鲲鹏服务器】【动态库兼容问题】ELF load command alignment not page-aligned https://bbs.huaweicloud.com/forum/thread-179867-1-1.html 13.【鲲鹏架构服务器安装mongodb】【安装mongodb】为什么鲲鹏架构服务器安装mongodb,解压编译需要100多g磁盘空间 https://bbs.huaweicloud.com/forum/thread-179597-1-1.html 14.【D920S10主板】【升级BIOS】安装Ubuntu报ACPI CPPC的错误 https://bbs.huaweicloud.com/forum/thread-179497-1-1.html 15.【kunpeng920】【perf】请问dtlb_load_misses.walk_duration 这个事件怎么查到? 谢谢! https://bbs.huaweicloud.com/forum/thread-162174-1-1.html 16.yum install javapackages-local 鲲鹏 欧拉无法安装依赖 https://bbs.huaweicloud.com/forum/thread-178019-1-1.html 17.【sentry cdh630编译】【监控页面打不开】 sentry cdh编译完成后,监控页面访问失败 https://bbs.huaweicloud.com/forum/thread-105077-1-1.html 18.【openEuler+鲲鹏架构服务器】【mongodb安装】mongodb安装为什么需要100g以上的磁盘空间 https://bbs.huaweicloud.com/forum/thread-176927-1-1.html 19.【鲲鹏架构服务器】【安装mongodb】mongodb安装占用磁盘过多,40g磁盘占用完,有没有更加好的安装方法 https://bbs.huaweicloud.com/forum/thread-176507-1-1.html 20.【openEuler+鲲鹏架构服务器对应版本的组件下载】【mongdb、mlysql如何下载】 https://bbs.huaweicloud.com/forum/thread-176112-1-1.html
总条数:168 到第
上滑加载中