• [问题求助] Huawei Cloud EulerOS 2.0安装 MongoDB 失败,如何处理?
    [root@hcss~]# yum install -y mongodb-orgLast metadata expiration check: 0:20:14 ago on Fri 02 Aug 2024 08:20:14 PM CST.Error:Problem: package mongodb-org-4.4.29-1.el7.x86_64 requires mongodb-org-shell = 4.4.29, but none of the providers can be installed- cannot install the best candidate for the job- nothing provides libcrypto.so.10()(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64- nothing provides libssl.so.10()(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64- nothing provides libcrypto.so.10(OPENSSL_1.0.1)(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64- nothing provides libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64- nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64- nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mongodb-org-shell-4.4.29-1.el7.x86_64(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
  • [技术干货] Mongodb使用索引进行查询优化的操作方法【转】
    前面的文档当中,我们重点介绍了mongodb数据更新update中各种各样的操作符。有兴趣的小伙伴们可以查看本专栏里的相关文章。这篇文章,结合官方文档,探讨一下使用索引进行查询优化。概述为集合建立合适的索引,能够有效的减少查询操作时扫描数据的数量 ,从而提高查询效率,简化了mongodb内部查询工作。如原来的某个查询需要进行全表扫描。当集合中有1000条数据时,可能需要逐一扫描这1000条数据,才可以返回查询结果。而当为查询字段添加索引后,通过索引,直接定位到查询结果,可能会极大的减少扫描文档数据的数量。为读取操作添加索引当用户建立查询语句,计划通过指定字段或几个字段查询数据时,在指定字段的索引或者几个字段的复合索引能够避免对集合进行全表扫描。如一个针对表inventory的查询,要求使用字段type作为过滤条件,type是用户指定的一个数值为了提高这个针对集合inventory查询的性能,在集合inventory创建一个type字段的索引。使用db.collection.createIndex()方法创建。这个索引,能够避免查询整个集合来返回数据。用户可以通过分析执行计划,来确定mongodb是否使用当前索引。除了提高查询效率以外,索引还可以改善排序操作的效率并能够提过存储空间使用率。查询操作过滤度查询操作过滤度表示了查询操作中使用的过滤词排除或者过滤文档的优良程度。查询操作过滤度能够决定该查询是否使用索引。高过滤度查询,能够匹配出更小范围的文档数据。如针对_id字段等等值查询就具备非常高的查询操作过滤度。它几乎可以匹配到唯一的文档数据。相反,低过滤度的查询会匹配集合中更多百分比的数据,几乎不能使用索引。例如不等操作就不是高过滤度查询操作,这两个查询操作经常会匹配到集合中大部分的数据。因此在大多数查询当中,带有$nin和$ne操作的查询,使用索引查询效率,不会比全表扫描高多少。而对于正则表达式的查询过滤度,还与正则表达式本身相关。索引覆盖查询索引覆盖查询只完全通过索引过滤数据并且使用索引中的字段来返回结果而不需要查询文档数据的查询。同时满足下面三个条件,就可以所该索引覆盖了查询查询中所有查询字段都是索引的一部分查询返回字段也包含在该索引当中查询当中过滤字段没有对null的过滤(如{"field": null}或者{"field": {$eq: null}})。嵌入式文档索引覆盖查询多键索引覆盖查询多键索引能够覆盖针对索引中非数组字段的查询。不能覆盖带有数组字段的查询。索引覆盖查询性能因为索引当中已经包含了查询中所需要的所有字段和返回字段 ,mongodb可以只通过索引返回查询结果。只通过索引的查询效率,比其他任何索引外查询的效率都要高。因为索引通常保存在内存当中或顺序的保存在磁盘上,而且会比索引依赖的文档小。索引查询优化限制地理信息索引不支持索引覆盖查询多键查询不能覆盖带有数组字段的查询在分片集中,包含分片key的索引才能支持索引覆盖查询
  • [技术干货] MongoDB中自动增长ID详解(实现、应用及优化)【转】
    引言在MongoDB中,自动增长的功能主要通过使用数据库的ObjectId或自定义的序列来实现。ObjectId是MongoDB默认的主键类型,它是唯一的并且具有一定的排序特性。然而,在某些场景下,可能需要使用自定义的自动增长ID,例如在某些遗留系统中或者为了更好的用户体验。基本语法和命令使用ObjectIdObjectId是MongoDB默认的主键类型,它由12字节组成,包括时间戳、机器标识符、进程ID和计数器。每次插入新文档时,MongoDB会自动生成一个新的ObjectId。插入新文档时,_id字段会自动生成:1db.collection.insertOne({name: "example"})自定义自动增长ID如果需要自定义自动增长ID,可以使用以下方法:创建计数器集合:创建一个专门的集合来存储序列计数器。12db.createCollection("counters")db.counters.insertOne({_id: "productid", seq: 0})定义获取下一个序列值的函数:使用findAndModify原子操作来获取并增加序列值。12345678function getNextSequence(name) {    var ret = db.counters.findAndModify({        query: { _id: name },        update: { $inc: { seq: 1 } },        new: true    });    return ret.seq;}插入新文档并使用自定义ID:在插入新文档时,调用该函数以生成新的ID。1234db.products.insertOne({    _id: getNextSequence("productid"),    name: "example"})示例以下是完整的示例代码:创建计数器集合并插入初始值:1db.counters.insertOne({_id: "userid", seq: 0})定义获取下一个序列值的函数:12345678function getNextSequence(name) {    var ret = db.counters.findAndModify({        query: { _id: name },        update: { $inc: { seq: 1 } },        new: true    });    return ret.seq;}插入新文档并使用自定义ID:1234db.users.insertOne({    _id: getNextSequence("userid"),    name: "John Doe"})
  • [技术干货] MongoDB磁盘空间占满导致数据库被锁定的解决方法【转】
    一、问题1、我在实际项目中,遇到一个问题,随着数据每天的不断增加,导致mongodb的磁盘空间站满了,数据库被锁了,无法使用。2、故障表现部署的应用程序突然无法将数据写入数据库,但是可以正常读取数据。管理人员通过客户端连接数据库进行排查时,可以写入一条数据,返回错误信息:not authorized on xxxx to execute command3、检查磁盘空间是否被耗尽登录mongodb管理控制台,查看实例的状态,会发现已被锁定,并且磁盘空间占用已经100%Size的值不一定会减少。当storageSize大于size时,表示已产生磁盘碎片。(2)compact是云数据库MongoDB的压缩命令,执行compact命令可以回收删除数据后产生的磁盘碎片,实现压缩磁盘空间的目的,从而提升磁盘利用率。4、删除数据库数据这里以表valueOpenData为例子,针对主节点,进行演示操作,之前已经清理了一部分表的磁盘空间,现已经不是100%。删除数据,是不会减少磁盘空间的,这个一定要注意。执行删除方案,删除某一段时间之前的数据:12345db.valveOpenData.deleteMany({      "dataReadTime": {            "$lte": ISODate("2022-12-30T23:59:59Z")      }  })5、查看集合需回收的磁盘碎片空间删除数据 清理磁盘之前的总磁盘占用情况执行查看集合需回收的磁盘碎片空间语句1db.valveOpenData.stats().wiredTiger["block-manager"]["file bytes available for reuse"]结果:可清理磁盘碎片 9161187328 byte6、回收单节点或副本集实例的磁盘碎片 单节点实例只有一个StandAlone节点,您只需要连接主节点(Primary节点),执行compact命令回收主节点(Primary节点)的磁盘碎片。副本集实例具有多个节点,您需要分别连接主节点(Primary节点)和从节点(Secondary节点),在不同节点上执行compact命令回收相应节点的磁盘碎片,执行的回收命令相同。我这里回收的是主节点(Primary节点)磁盘碎片。执行语句1db.runCommand({compact:"valveOpenData"})强制执行语句1db.runCommand({compact:"valveOpenData",force:true})执行成功的返回结果如下:{ "ok" : 1 }  ,清理磁盘空间完成,你也可以多执行几次清理。执行查看集合需回收的磁盘碎片空间语句1db.valveOpenData.stats().wiredTiger["block-manager"]["file bytes available for reuse"]结果:清理过后磁盘碎片 1072041984 byte
  • [技术干货] MongoDB内存过高问题分析及解决【转】
    告警公司有个3.2.7版本的mongo复制集,最近几天频繁告警内存过高。服务器配置16C+64G内存。mongo备节点内存使用到55G,触发告警。以下内容基于3.2.7版本,3.2.7版本已经太老,很多后来的命令和配置,3.2.7都没有。排查排查mongo配置主要是检查cacheSizeGB123wiredTiger:   engineConfig:        cacheSizeGB: 20MongoDB 3.2 及以后,默认使用 WiredTiger 存储引擎,可通过 cacheSizeGB 选项配置 WiredTiger 引擎使用内存的上限,一般建议配置在系统可用内存的一班左右。默认值是(RAM – 1GB) / 2。出发点是防止系统OOM kill。因为这里的配置只是wiredTiger的内存cache限额,并不是mongo的全部使用内存限额,整个mongo进程的内存占用要比这个值大,所以cacheSizeGB万万不可设置超过RAM的60%。我们这里配置到了20G。但是实际运行中发现,在并发查询很高的情况下,wt的cacheSize还是会超过这个配置一点点。查看mongo实例的内存使用情况1db.serverStatus().wiredTiger.cache返回结果中 bytes currently in the cache 后的值为缓存数据的大小123..."bytes currently in the cache" : 21483838298,...已经用满了,这种情况可以加一下内存了。但是内存太贵,业务也没有那么高的性能要求,保障不宕机是更有性价比的方案。既然cache只用了20G,看看tcmalloc的情况1db.serverStatus().tcmalloc12345678910111213141516171819------------------------------------------------MALLOC:    22351254936 (21315.8 MiB) Bytes in use by applicationMALLOC: +  24922800128 (23768.2 MiB) Bytes in page heap freelistMALLOC: +    449403872 (  428.6 MiB) Bytes in central cache freelistMALLOC: +       262144 (    0.2 MiB) Bytes in transfer cache freelistMALLOC: +    841870984 (  802.9 MiB) Bytes in thread cache freelistsMALLOC: +    109572256 (  104.5 MiB) Bytes in malloc metadataMALLOC:   ------------MALLOC: =  48675164320 (46420.3 MiB) Actual memory used (physical + swap)MALLOC: +   8663441408 ( 8262.1 MiB) Bytes released to OS (aka unmapped)MALLOC:   ------------MALLOC: =  57338605728 (54682.4 MiB) Virtual address space usedMALLOC:MALLOC:         378600              Spans in useMALLOC:           1451              Thread heaps in useMALLOC:           8192              Tcmalloc page size------------------------------------------------Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).Bytes released to the OS take up virtual address space but no physical memory.可以看到page heap freelist占了大头。解释一下,57338605728 (54682.4 MiB) Virtual address space used 是mongo总的使用的虚拟内存。48675164320 (46420.3 MiB) Actual memory used (physical + swap)是mongo总的使用的实际内存。(我没有开swap)实际内存又分成两部分,freelist中的和非freelist的。freelist的就是已经分配后来又用完释放的内存,存在这个freelist数据结构中,已备后面重用这些内存,我的理解就是我用完了,但是我先拿着。这样后面的业务来了,mongo就不需要再向os申请分配内存这一步了,从性能和效率的维度来看更好。但是缺点是内存一直没有还给os,导致os角度来看,内存的使用率很高。tcmalloc 为性能考虑,每个线程会有自己的 local free page cache,还有 central free page cache;内存申请时,按 local thread free page cache ==> central free page cache 查找可用内存,找不到可用内存时才会从堆上申请;当释放内存时,也会归还到 cache 里,tcmalloc 后台慢慢再归还给 OS操作系统, 多数情况下,内存使用率高的原因是 tcmalloc 未能及时将内存归还给操作系统,导致内存最大可能达到几十GB。mongo为了提高性能,倾向于利用os上尽可能多的内存。解决所以可以将freelist的内存及时释放给os,可以解决内存水位过高的问题。1db.adminCommand({setParameter:1,tcmallocAggressiveMemoryDecommit:1})tcmallocAggressiveMemoryDecommit 是一个服务器参数,用于控制 TCMalloc 内存分配器在什么程度上积极地将不再使用的内存释放回操作系统。当设置为 1(开启状态)时,tcmallocAggressiveMemoryDecommit 会使 TCMalloc 更积极地释放不再使用的内存。这意味着当应用程序释放内存后,TCMalloc 会尝试将这部分内存标记为空闲并返回给操作系统,而不是保留在进程的地址空间中以便快速重用。
  • [技术干货] Mongodb 的基本用法
    什么是MongodbMongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成,类似于JSON对象。MongoDB文档支持动态查询,可以通过网络访问,且支持丰富的数据表达和索引。Mongodb与传统数据库的区别MongoDB与传统数据库的区别主要体现在以下几个方面:数据存储方式:MongoDB是一种文档数据库,以文档为单位存储数据,文档类型为BSON(二进制JSON)。而传统关系型数据库(如MySQL、SQL Server、Oracle等)则以结构化数据为主,数据存储在表格中,每一行必须符合表结构。数据结构:MongoDB的数据结构非常松散,可以存储比较复杂的数据类型,且同一个表下可以存储不同结构的对象。而传统关系型数据库的数据结构则较为固定,列的个数和类型都需要预先定义。扩展性:MongoDB是一个分布式数据库,支持水平扩展,可以方便地添加更多的服务器来扩展性能和存储容量。而传统关系型数据库则需要通过升级硬件或增加分库分表等方式进行扩展。查询语言:MongoDB使用基于文档的查询语言,语法较为灵活,可以通过JavaScript进行操作。而传统关系型数据库则使用SQL作为查询语言。事务处理:MongoDB支持ACID事务,但并非所有操作都需要事务处理,可以根据应用需求进行选择。而传统关系型数据库则通过ACID事务来保证数据的完整性和一致性。数据一致性:MongoDB的默认一致性级别是最终一致性,但也可以根据需求进行调整。而传统关系型数据库则通常通过强一致性来保证数据的一致性。应用场景:MongoDB适用于Web应用、实时数据处理、大数据分析等场景,可以方便地存储和处理非结构化数据。而传统关系型数据库则更适用于结构化数据处理、事务处理、复杂查询等场景。Python 操作MongodbPython操作MongoDB需要使用PyMongo库。PyMongo是一个Python编写的MongoDB驱动程序,用于连接MongoDB数据库,执行CRUD(创建、读取、更新和删除)操作以及执行其他数据库管理任务。以下是一个简单的Python代码示例,演示如何使用PyMongo库操作MongoDB:首先,确保已经安装了PyMongo库。你可以使用以下命令使用pip安装:pip install pymongo安装完成后,你可以使用以下代码连接到MongoDB数据库,并执行一些基本操作:from pymongo import MongoClient # 连接到MongoDB服务器 client = MongoClient('localhost', 27017) # 选择数据库 db = client['mydatabase'] # 选择集合(表) collection = db['customers'] # 插入文档(记录) customer = { "name": "John Doe", "address": { "street": "123 Main St", "city": "Anytown", "state": "NY", "zip": "12345" }, "phone": "555-555-5555" } result = collection.insert_one(customer) print("Inserted document with ID:", result.inserted_id) # 查询文档 query = { "name": "John Doe" } cursor = collection.find(query) for document in cursor: print(document) # 更新文档 query = { "name": "John Doe" } new_values = { "$set": { "address.city": "Newtown" } } result = collection.update_one(query, new_values) print("Updated", result.modified_count, "document") # 删除文档 query = { "name": "John Doe" } result = collection.delete_one(query) print("Deleted", result.deleted_count, "document")在上面的示例中,我们首先使用MongoClient类连接到MongoDB服务器。然后,我们选择要使用的数据库和集合(类似于表)。接下来,我们演示了插入、查询、更新和删除文档的基本操作。每个操作都使用相应的PyMongo方法执行,并通过打印相关结果来验证操作是否成功。Java 操作MongodbJava操作MongoDB需要使用MongoDB的Java驱动程序。MongoDB提供了官方的Java驱动程序,称为MongoDB Java Driver,它提供了与MongoDB数据库进行交互的Java API。以下是一个简单的Java代码示例,演示如何使用MongoDB Java Driver连接MongoDB数据库并执行基本操作:首先,确保已将MongoDB Java Driver添加到Java项目的类路径中。你可以通过Maven或Gradle等构建工具来添加依赖项。Maven依赖项示例:<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.2.3</version> <!-- 请使用最新版本 --> </dependency>然后,你可以使用以下代码连接到MongoDB数据库并执行操作:import com.mongodb.MongoClient; import com.mongodb.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Updates; import org.bson.Document; public class MongoDBExample { public static void main(String[] args) { // 连接到MongoDB服务器 MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017"); // 选择数据库 MongoDatabase database = mongoClient.getDatabase("mydatabase"); // 选择集合(表) MongoCollection<Document> collection = database.getCollection("customers"); // 插入文档(记录) Document customer = new Document() .append("name", "John Doe") .append("address", new Document() .append("street", "123 Main St") .append("city", "Anytown") .append("state", "NY") .append("zip", "12345")) .append("phone", "555-555-5555"); collection.insertOne(customer); System.out.println("Inserted document with ID: " + customer.getObjectId("_id")); // 查询文档 Document query = new Document("name", "John Doe"); for (Document document : collection.find(query)) { System.out.println(document.toJson()); } // 更新文档 Document updateQuery = new Document("name", "John Doe"); Document newValues = new Document("$set", new Document("address.city", "Newtown")); collection.updateOne(updateQuery, newValues); System.out.println("Updated document"); // 删除文档 collection.deleteOne(updateQuery); System.out.println("Deleted document"); // 关闭连接 mongoClient.close(); } }在上面的示例中,我们首先使用MongoClients类创建一个MongoClient实例来连接到MongoDB服务器。然后,我们选择要使用的数据库和集合(类似于表)。接下来,我们演示了插入、查询、更新和删除文档的基本操作。每个操作都使用相应的MongoDB Java Driver方法执行,并通过打印相关结果来验证操作是否成功。最后,我们关闭与MongoDB的连接。
  • [技术干货] Mongodb原理解读
    Mongodb定义MongoDB 是一个基于分布式文件存储的 NoSQL 数据库,它的数据结构是类似文档的,而不是像传统的关系型数据库那样使用表格。MongoDB 的数据是存储在文档中的,这些文档类似于 JSON 对象,可以进行嵌套或链接。MongoDB 的主要特点面向文档的存储:MongoDB 的数据是存储在文档中的,每个文档可以包含多个键值对,这些键值对就是数据库中的字段和值。这种面向文档的存储方式使得 MongoDB 非常适合存储非结构化的数据,例如 JSON 数据、XML 数据等。动态查询:MongoDB 支持类似 JSON 的查询语言,可以使用该语言进行动态查询。这种查询语言非常灵活,可以轻松地构建复杂的查询条件,并且支持嵌套查询和链接查询。面向集合的存储:MongoDB 的数据是按照集合来存储的,每个集合可以包含多个文档。集合类似于关系型数据库中的表,但是集合并不要求文档具有相同的结构。分布式:MongoDB 是分布式的数据库,可以在多个服务器之间进行分片存储。这种分布式架构使得 MongoDB 可以轻松地扩展到大量数据和高并发访问的场景。高效性能:MongoDB 具有良好的性能,特别是在读取操作方面。这主要是因为 MongoDB 使用内存映射文件(mmap)来管理数据,将数据直接映射到内存中,从而提高了读取效率。灵活的数据模型:MongoDB 的数据模型非常灵活,可以轻松地添加或删除字段,而不会影响其他文档的操作。这使得 MongoDB 非常适合于快速迭代和灵活的业务需求。MongoDB 与传统数据库的区别MongoDB 和传统数据库的区别主要体现在以下三个方面:数据模型:传统数据库通常使用表格来存储数据,而 MongoDB 使用文档模型来存储数据。这种模型非常适合存储非结构化或半结构化的数据,如 JSON 数据、XML 数据等。查询语言:传统数据库使用 SQL 语言进行查询和操作,而 MongoDB 使用 JSON 语法进行查询和操作。这种查询语言非常灵活,可以嵌套字段、使用比较操作符、使用逻辑操作符等。性能和可扩展性:MongoDB 和传统数据库在性能和可扩展性方面也有所不同。MongoDB 通常用于处理大量的非结构化数据,例如文档、图像、视频、音频等,它可以快速访问并处理这些数据,而不需要将其分解为多个表格。此外,MongoDB 非常适合处理分布式数据,可以轻松扩展到多个节点,以处理大量的数据负载。而传统数据库通常在复杂的事务处理方面表现得更加优秀,例如多个操作的集合,以确保数据完整性和一致性。
  • [技术干货] 鲲鹏环境下MongDB客户端驱动安装过程参考
    1、安装mongdb-c-driver1.1 安装libbson库1.0.0版本参考:cid:link_41)安装环境依赖yum install git automake autoconf libtool gcc2)获取libbson库1.0.0版本源码wget cid:link_33)解压libbson库1.0.0版本源码tar zxvf 1.0.0.tar.gz4)进入libbson-1.0.0路径执行编译cd libbson-1.0.0/ ./autogen.sh make make install 1.2 安装libmongc驱动1)获取mongo-c-driver-1.13.1.tar.gz源码下载地址:cid:link_2wget cid:link_12)解压mongo-c-driver-1.13.1.tar.gz源码tar zxvf 1.13.1.tar.gz3)进入mongo-c-driver-1.13.1.tar.gz源码解压路径cd mongo-c-driver-1.13.1/4)创建编译路径mkdir cmake-build5)进入编译路径cd cmake-build/6)执行编译cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..make 7)执行编译安装make install2、安装libmongcxx 版本 1)获取mongo-cxx-driver-r3.4.0.tar.gz源码wget cid:link_02)解压mongo-cxx-driver-r3.4.0.tar.gztar zxzf r3.4.0.tar.gz 3)进入mongo-cxx-driver-r3.4.0.tar.gz解压路径cd mongo-cxx-driver-r3.4.0/build/4)执行编译cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON -DBSONCXX_POLY_USE_SYSTEM_MNMLSTC=0 -DCMAKE_PREFIX_PATH=/usr/local/lib/ -DCMAKE_INSTALL_PREFIX=/usr/local/【注】:其中,/usr/local/lib/是libmonc的驱动安装路径make -j 96 5)执行编译安装make install 注:上面的步骤均需执行;FAQ 【问题描述】安装libmongcxx 版本执行如下命令cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON -DBSONCXX_POLY_USE_SYSTEM_MNMLSTC=0 -DCMAKE_PREFIX_PATH=/usr/local/lib/ -DCMAKE_INSTALL_PREFIX=/usr/local/报如下错误:CMake Error at src/bsoncxx/CMakeLists.txt:81 (find_package): By not providing "Findlibbson-1.0.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "libbson-1.0", but CMake did not find one. Could not find a package configuration file provided by "libbson-1.0" (requested version 1.10.0) with any of the following names: libbson-1.0Config.cmake libbson-1.0-config.cmake Add the installation prefix of "libbson-1.0" to CMAKE_PREFIX_PATH or set "libbson-1.0_DIR" to a directory containing one of the above files.  If "libbson-1.0" provides a separate development package or SDK, be sure it has been installed.【问题原因】:因为mongo-c-driver没有安装;【解决方法】:安装libmongc驱动,获取源码执行cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..后,还需要执行make && make install 进行安装,然后再编译mongo-cxx-driver即可。
  • [技术干货] openEuler 20.03 LTS SP1系统编译安装MongoDB 4.4.0(aarch64)指导
    1 简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。官方链接: https://www.mongodb.com/类别:数据库语言:C++/JavaScript/Python/2 环境类别子项版本获取地址(方法)硬件CPUKunpeng920iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSopenEuler20.03 LTS SP1cat /etc/os-releaseKernel4.19.90cat /proc/version软件GCC9.3.1参考下面安装说明 gcc -vOpenJDK1.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/cc14.2 编译安装cython1、进入/hom目录获取cython源码cd /home/git clone cid:link_4注:如果系统环境无法联网,则手动单击链接cid:link_4打开网页,然后单击“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 cid:link_5注:如果系统环境无法联网,则手动单击链接cid:link_5打开网页,然后单击“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 cid:link_3注:如果系统环境无法联网,则手动单击链接cid:link_3打开网页,然后单击“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 install5 编译安装1、下载MongoDB 4.4.0源码wget cid:link_2 -O mongo-r4.4.0.tar.gztar xf mongo-r4.4.0.tar.gz注:如果系统环境无法联网,则手动点击cid:link_2下载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 mongo6 验证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、cid:link_03、cid:link_18 FAQ1、执行./mongod启动MongoDB失败,报“/data/db not found”错误【详细描述】:执行./mongod启动MongoDB失败,报“/data/db not found”错误,具体报错如下:解答:执行mkdir -p /data/db命令创建dbpath路径,再次执行./mongod &启动MongoDB数据库。
  • [问题求助] Huawei Cloud EulerOS 2.0 等保2.0三级版 64位 怎么安装mongodb5
    请问:Huawei Cloud EulerOS 2.0 等保2.0三级版 64位 怎么安装mongodb5啊?弄了半天整不明白啊。用了linux 的安装方法也不行。
  • [问题求助] 【obs产品】【并行文件系统】mongodb的数据路径指向obsfs挂载的盘
    【功能模块】obs对象存储,并行文件系统【操作步骤&问题现象】1、将mongdb的数据路径放在并行文件系统中2、启动mongodb,日志的预加载文件写入速度每秒128K,有没有办法提速。我知道obs不适合数据库这类零碎文件存储,但想试试看。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 受到华尔街追捧,MongoDB热度直线上升
    6月7日(美国时间),MongoDB年度最大的活动MongoDB World 2022在纽约举行。会上,MongoDB发布了公司新愿景——成为开发者数据平台提供商,同时还发布了一系列新产品和功能,包括其旗舰数据库 MongoDB 6.0、增强的分析功能、Atlas数据湖服务以及可查询加密数据技术等。这些新功能将进一步优化开发人员的体验、简化发布流程、加速创新步伐。MongoDB World是MongoDB每年一度的市场活动,会议当天MongoDB股价飙升7.65%,领涨美股云计算板块,引来了更多人关注。实际上,近几个月来,MongoDB一直很受华尔街关注,热度直逼网红股Snowflake,包括摩根斯坦利、花旗银行等多家分析机构分析师给予MongoDB“增持”的评级。MongoDB公司于2007年在纽约成立,2017年10月在纳斯达克上市,是纳斯达克第一家上市的数据库公司。MongoDB从成立以来一直处于高速增长之中,市值从最初的12亿美元上涨到目前的200亿美元左右,一度突破300亿美元。与此同时,MongoDB已经成为文档数据库的事实标准,AWS、Azure等云平台商推出的文档数据库纷纷选择与其兼容,并专门为其提供API接口。“今天的MongoDB是世界上用于构建现代应用程序最受欢迎的数据库。”MongoDB首席执行官兼总裁 Dev Ittycheria 在大会主题演讲中表示。下面这些数字提供了很好的证明:截至目前MongoDB社区版下载量超过了2.65亿次,仅仅过去12个月的下载量就比MongoDB之前下载量的总和还要多(中国是下载量最大的地区),在全球100多个国家拥有3.5万家客户。此外,MongoDB云服务版Atlas进展顺利,已经在AWS、Google Cloud和 Azure的全球95个区域运行,MongoDB 还与世界各地的其他云提供商合作,其中包括中国的阿里云和腾讯云。 伴随着MongoDB产品功能的不断丰富,MongoDB不再把自己仅仅定位为文档型数据库,而是希望成为一个通用数据库,同时不断向更多应用场景扩张。尤为值得关注的是,MongoDB正在向传统数据库领域渗透,与Oracle等传统数据库巨头的竞争正在悄悄展开,这一场竞争结果或许将对数据库市场的未来演变带来重要影响。 01  提供现代而便捷的开发体验MongoDB是一个专门为“开发者(Developer)”打造的数据库,也正是这一出发点让MongoDB成为最受开发者认可的数据库之一。在DB-Engine排行榜上,MongoDB多年来一直和Oracle、MySQL、SQL Server、PostgreSQL一起成为最受关注的5个数据库产品。  “MongoDB致力于帮助开发人员提升效率,减少他们非必要的工作。这是公司从15年前成立就一直秉承的核心理念,也正是这一理念让MongoDB拥有世界上最忠实的开发者社区。” MongoDB首席技术官Mark Porter在接受记者采访时表示。 Dev Ittycheria在大会的主题演讲中也强调了类似观点,他说:“我们构建的每一个产品,我们开发的每一个功能都是为了提高开发人员的生产力。”如何让开发人员变得异常快速和高效?MongoDB选择以文档模型为突破口。该模型改变了传统数据库以表格来组织数据和与数据交互的方式,灵活而且可以很容易扩展。基于此模型,MongoDB构建了整个产品系列。 “未来几年,不计其数的全新应用程序将不断面世,这些应用程序可以提供令人惊艳的客户体验,满足企业转型的功能需求,通过更尖端的自动化水平提高运营效率等,这些都离不开一个高度可扩展、云原生、全球分布式的数据平台。”Dev Ittycheria表示,MongoDB的愿景是打造一个开发者数据平台,为开发者提供现代、便捷的使用体验,广泛支持各种用例,并满足最为严苛的性能和规模要求。 Dev Ittycheria援引 IDC的数据说,到2025年将有7.5亿个新的数字应用程序,而且未来4年构建的应用程序将比前40年构建的应用程序还多。 创新的步伐正在加快,意味着开发人员的生产力越来越重要。为了支持开发人员创新的需求,MongoDB致力于打造出一个高效的开发者数据平台,以帮助开发者更快速地开发应用,让企业迅速把握机遇,以更好地应对挑战。02 不仅仅是文档型数据库MongoDB属于文档型数据库,这也是人们对MongoDB的普遍认知。不过,MongoDB显然无意强化人们的这一认知,而是正好相反,MongoDB希望突出其通用性,以将应用场景拓展到更广泛的领域。为此,MongoDB不断增加支持的数据类型。 Mark Porter说,今天的MongoDB几乎支持所有的数据类型,包括文档、图形、数组、文本、对象、地理空间、时间序列和关系型数据等,同时一直在强化对这些数据类型的支持能力。其目的就希望通过一个统一的数据库来帮助开发者处理所有需求,从而简化开发者的工作。 因为在MongoDB看来,“通用”让开发人员的生活更轻松,而 MongoDB 一直专注于为开发人员提供便利。比如,MongoDB 6.0新增的时间序列集合就可以简化应用程序构建,加快构建速度并降低成本。 在即将发布的MongoDB 6.0版本中,时间序列集合功能将支持测量数据库的二级索引,并针对读取性能进行改进和优化,以便更快地对时序数据进行排序。尽管市场上有许多专门针对时间序列数据的数据库,但许多人可能不想为此专门建立一个新的数据库。 一般而言,NoSQL与关系型数据库是两个不同的市场,两者基本不会存在直接竞争关系。不过,正如MongoDB并不把自己限定在NoSQL一样,它对关系数据库市场同样有兴趣。实际上,MongoDB正在将覆盖领域扩展到关系型数据市场,大会上推出的Rational Migrator工具就是举措之一,它可帮助用户把数据从关系型数据库(包括Oracle、SQL Server、MySQL和 PostgreSQL)轻松地迁移到MongoDB。 MongoDB未来与关系型数据库会是竞争关系吗?对此,Mark Porter表示,关系数据库太不灵活,也不便于扩展。多年来,MongoDB一直在与关系数据库竞争并赢得胜利。因为MongoDB将通用的现代分布式架构与强大的基础数据库功能(如ACID事务和企业级安全性)相结合,让用户能比利用其他平台更快地构建创新性、高度可扩展的应用程序。 “Relational Migrator工具的推出是回应众多客户的需求,他们希望更容易地将旧的遗留应用程序转移到 MongoDB。”Mark Porter说。03  满足更多应用场景的需求今年MongoDB World大会上发布的新产品和功能超过了150项,达到了近几年的一个高峰。其中一些让人尤为印象深刻,分析能力就是其中之一。 随着大数据时代的兴起,数据分析的需求越来越普遍,对分析的支持成为数据库能力的重要组成部分。显然,MongoDB也注意到用户不断增长的分析需求。不过,MongoDB最先响应的是更靠近应用程序的分析需求,而不是离线分析。这一点也不难理解,在 MongoDB 的世界里,前者能让开发人员能够更方便地构建应用程序,而离线分析可能更多地面向数据分析人员。 为了方便开发人员的工作,MongoDB推出了几种新手段来简化针对运营数据的分析,支持应用内分析的列存储索引技术就是其中之一。由于列格式非常适合分析类工作,因此该索引选项使开发人员可以轻松地将文档保存在适合其应用程序的模型中,而无需迁移数据,从而大幅提升许多常见分析查询的速度。此外,分析节点目前已支持单独扩展,便于团队独立调整其操作和分析查询性能,避免出现过度配置或配置不足情况。 “我们会优先关注应用内分析能力,如产品推荐、防欺诈等,而不是OLAP。前者要在很短的时间内完成,一般低于1秒,有的甚至在100毫秒内,完全不同于数据仓库。”Mark Porter表示。 其他支持分析的技术还包括新的Atlas SQL Interface、Atlas Data Federation 、Atlas Data Lake、Cluster-to-Cluster Synchronization等。 另外,MongoDB的云服务版Atlas尤其值得一提。MongoDB今天的成功很大程度上就是因为Atlas。Atlas于2016年正式推出以来,增长迅速,最近4个季度都保持80%的增长,贡献了MongoDB 60%的营收,对MongoDB的重要性由此可见一斑。 高速增长的背后是MongoDB一直在不断丰富Atlas的功能,除了前面提到的分析能力方面增强外,今年Atlas还新增了不少其他功能,包括Atlas Search、Atlas Device Sync、Data API等。其中,Atlas Search是在应用程序中构建基于相关性搜索功能的最迅速且最简单的方法;Atlas Device Sync可以实现Atlas与移动端数据库Realm的同步;Data API无需额外的开发就可以通过HTTPS协议为Atlas中的数据提供安全的API访问服务。 近年来,无服务器计算是云计算市场的热点,此前MongoDB已经推出了Atlas Serverless预览版。在大会上,MongoDB宣布Atlas Serverless已全面上市,用户已经可以在AWS、Azure、GCP的平台中使用这一功能。04  突破加密技术,保护使用中的数据如果要问今年MongoDB World大会的参会者,哪项技术发布印象最深?可查询加密(Queryable Encryption)很可能会高票当选。 这些年,MongoDB一直在持续提升安全性,但可查询加密将其安全性提高了新的层次。虽然大多数数据库已经对如何保护静态或动态数据的安全有了很好的办法,但一直无法对使用中的数据进行很好地保护。目前,针对使用中数据进行加密技术普遍很复杂,需要使用来自应用程序端的自定义代码,还需要加密密钥管理,以便对数据进行加密和解密;同时,开发者还需要掌握一定的密码学经验。另外,查询功能会受限,甚至有些不具备查询功能,这导致应用层数据加密变得格外困难,性能上也很难得到保证。 可查询加密技术支持客户从客户端加密敏感数据,将完全随机加密的数据存储在数据库服务器端,并对加密数据执行表达式查询。随着可查询加密技术的推出,MongoDB成为唯一一家支持客户对完全随机加密数据执行表达式查询的数据库提供商,包括等值查询(预览版中可用)、范围查询、前缀查询、后缀查询、子串查询等(即将推出)。对于那些既需要执行表达式查询,又需要确保数据安全的企业而言,这无疑是一个巨大优势。05  写在最后当前,数据库市场仍处于高速增长态势。根据Gartner发布的《2021年数据库管理系统(DBMS)市场研究报告》,非关系型数据库市场2021年总收入为 148亿美元,年增长22%,占整个数据库市场的19%。其中,MongoDB表现亮眼,年增长达到47%,远高于市场平均水平。与AWS、Google、阿里云、Cloudera一起位列市场前5位,已经把其他NoSQL厂商甩在了身后。 随着MongoDB的成长,MongoDB面对的竞争对手会越来愈多,其中有像Snowflake这样的高增长热门公司,更有像甲骨文和 IBM 这样的老牌公司,竞争可能会非常激烈。特别是与传统数据库之间,这是一场事关数据库市场演变的竞争,我们期待竞争格局的演变。
  • [交流吐槽] 进大厂必看的 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 上相关的问题和关注者数量这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的。