-
1. 读取数据:find()方法find()方法用于查询MongoDB中的数据,功能类似于SQL中的SELECT,用于从集合中检索文档。例如:db.collection.find({field: value})1这里的field是字段名,value是我们要查询的值,这样就能获取字段值为value的所有文档。collection 是指数据库中的一个集合(Collection)。集合(collection):集合是 MongoDB 中存储文档(类似于关系型数据库中的表)的地方。一个集合里存储的是文档的集合,而每个文档可以具有不同的结构。2. 过滤和条件查询MongoDB支持多种条件操作符,以便我们灵活地查询数据。这些操作符包括:$eq:等于,匹配指定字段等于某个值的文档。$gt:大于,匹配指定字段大于某个值的文档。$lt:小于,匹配指定字段小于某个值的文档。$gte:大于等于,匹配指定字段大于或等于某个值的文档。$lte:小于等于,匹配指定字段小于或等于某个值的文档。例如,要查找年龄大于20的用户,可以使用以下语句:db.collection.find({age: {$gt: 20}})13. 聚合操作:aggregate()方法MongoDB的aggregate()方法类似于SQL中的聚合函数,用于执行复杂的数据处理和分析。常见的聚合操作有:$match:用于过滤数据,类似于SQL中的WHERE。$group:用于分组数据,类似于SQL中的GROUP BY。$sort:用于排序结果,类似于SQL中的ORDER BY。$limit:用于限制结果数量,类似于SQL中的LIMIT。例如,要计算每个城市的用户平均年龄,可以使用以下语句:db.collection.aggregate([ {$group: {_id: "$city", avgAge: {$avg: "$age"}}}])123在这个例子中,$group会将文档按city字段分组,然后通过$avg计算每个城市用户的平均年龄,并将结果存储在avgAge字段中。这些查询方法和聚合操作为MongoDB提供了强大的数据处理能力,使我们能够灵活、高效地检索和分析数据。例子以下是一些MongoDB查询和聚合操作的更多例子,帮助你更深入地理解其功能:1. find()方法(查询)查找某个字段等于某个值的所有文档:db.users.find({name: "Alice"})1查找所有name字段值为Alice的用户。查找多个条件的文档:db.users.find({age: {$gt: 20}, city: "New York"})1查找年龄大于20且城市为New York的用户。查找字段值存在某个条件的文档:db.users.find({email: {$exists: true}})1查找所有有email字段的用户。查找字段值不等于某个值:db.users.find({status: {$ne: "inactive"}})1查找status字段不等于inactive的用户。2. 过滤和条件查询查找年龄在20到30岁之间的用户:db.users.find({age: {$gte: 20, $lte: 30}})1这里使用了$gte(大于等于)和$lte(小于等于)来定义年龄范围。查找字段值存在某个子字符串:db.users.find({name: {$regex: /Alice/}})1使用正则表达式查找包含Alice的name字段。查找数组中有某个元素的文档:db.users.find({hobbies: {$in: ["reading", "traveling"]}})1查找hobbies数组字段中包含reading或traveling的文档。查找数组中没有某个元素的文档:db.users.find({hobbies: {$nin: ["swimming"]}})1查找hobbies数组字段中没有swimming的文档。3. 聚合操作(aggregate()方法)$match:筛选符合某些条件的文档db.users.aggregate([ {$match: {age: {$gte: 18}}}])123筛选出年龄大于或等于18岁的用户。$group:按某个字段分组并进行聚合计算db.users.aggregate([ {$group: {_id: "$city", totalUsers: {$sum: 1}}}])123按城市分组,计算每个城市的用户总数。$sort:对结果进行排序db.users.aggregate([ {$sort: {age: -1}}])123按年龄降序排列用户,-1表示降序。$limit:限制查询结果数量db.users.aggregate([ {$limit: 5}])123返回前5个文档。$project:选择要返回的字段并可以对其进行修改db.users.aggregate([ {$project: {name: 1, age: 1, _id: 0}}])123只返回name和age字段,并且不返回_id字段。$unwind:展开数组字段db.users.aggregate([ {$unwind: "$hobbies"}])123将hobbies数组字段中的每个元素都展开成单独的文档。$lookup:进行联接查询(类似SQL中的JOIN)db.orders.aggregate([ {$lookup: { from: "products", localField: "productId", foreignField: "_id", as: "productDetails" }}])将orders集合中的productId与products集合中的_id进行匹配,并将结果存储在productDetails字段中。这些例子展示了MongoDB如何通过多种查询方式、过滤条件和聚合操作满足各种数据检索需求。常用的语法结构db.集合名称.方法({字段名称: 值})1db:表示当前数据库。集合名称:表示具体要操作的集合,相当于关系型数据库中的表。方法:表示你要对该集合执行的操作,例如 find()、insertOne()、updateOne() 等。{字段名称: 值}:传入的参数用于指定查询条件、更新数据等。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/DXZFLY/article/details/143782447
-
在 MongoDB 中,数据备份和恢复是确保数据安全的关键操作。以下是几种常见的方法来实现 MongoDB 的数据备份和恢复:备份数据使用 mongodump 命令:mongodump 是一个官方提供的命令行工具,用于导出 MongoDB 数据库的内容到 BSON 文件中。备份所有数据库:mongodump --out <backup-directory>备份特定数据库:mongodump --db <database-name> --out <backup-directory>备份特定集合:mongodump --db <database-name> --collection <collection-name> --out <backup-directory>文件系统快照:对于基于磁盘存储引擎(如 WiredTiger)的 MongoDB 实例,可以通过创建文件系统级别的快照来备份数据。这种方法通常适用于虚拟机环境或支持快照功能的存储系统。步骤:停止写入操作。确保所有正在运行的操作都已完成。创建快照。恢复写入操作。使用复制集/分片集群:MongoDB 的复制集可以提供自动的数据冗余,这是通过将数据同步到多个节点实现的。如果主节点发生故障,可以快速切换到副本节点继续服务,并且可以从副本节点恢复数据。步骤:确保你的 MongoDB 部署在一个健康的复制集中。当需要恢复时,可以选择一个最新的健康副本作为新的主节点。MongoDB Atlas(Cloud Manager)备份:如果你使用的是 MongoDB Atlas 或 Cloud Manager,它们提供了自动化备份解决方案,包括按需备份、定期备份以及点对点恢复等功能。设置:登录到 MongoDB Atlas 控制台。选择集群并配置备份策略。执行备份和恢复操作。恢复数据使用 mongorestore 命令:mongorestore 用来从 mongodump 导出的文件中恢复数据。恢复所有数据库:mongorestore <backup-directory>恢复特定数据库:mongorestore --db <database-name> <backup-directory>恢复特定集合:mongorestore --db <database-name> --collection <collection-name> <backup-file-path>文件系统快照恢复:将快照恢复到 MongoDB 数据目录。重启 MongoDB 服务。复制集恢复:在复制集中提升一个副本为新的主节点。或者从副本节点手动拷贝数据到一个新的实例。MongoDB Atlas 恢复:通过 Atlas 控制台选择合适的备份点。按照指示进行恢复操作。注意事项在进行备份和恢复之前,务必停止所有写入操作,尤其是在使用 mongodump 或文件系统快照时。对于生产环境,建议在非工作时间执行备份和恢复,以减少对业务的影响。定期测试备份和恢复流程,确保备份的有效性。考虑备份文件的安全性和完整性,例如加密备份文件并将其存储在安全的地方。
-
MongoDB 是一个流行的 NoSQL 数据库,以下是一些常用的管理命令:数据库操作use <database>:切换到指定的数据库,如果数据库不存在,则创建一个新的数据库。show dbs:显示所有数据库的列表。db.dropDatabase():删除当前使用的数据库。集合操作<tiangong type="reference" index="1-3">db.createCollection("<collection_name>")</tiangong>:显式创建一个集合。show collections:显示当前数据库中的所有集合。<tiangong type="reference" index="6-5">db.<collection_name>.drop()</tiangong>:删除指定的集合。文档操作<tiangong type="reference" index="6-6">db.<collection_name>.insertOne(<document>)</tiangong>:向集合中插入一个文档。<tiangong type="reference" index="6-7">db.<collection_name>.insertMany([<document1>, <document2>,...])</tiangong>:向集合中插入多个文档。db.<collection_name>.find():查询集合中的所有文档。db.<collection_name>.findOne(<query>):查询集合中符合条件的一个文档。db.<collection_name>.updateOne(<query>, <update>):更新集合中符合条件的一个文档。db.<collection_name>.updateMany(<query>, <update>):更新集合中符合条件的多个文档。db.<collection_name>.deleteOne(<query>):删除集合中符合条件的一个文档。db.<collection_name>.deleteMany(<query>):删除集合中符合条件的多个文档。索引操作db.<collection_name>.createIndex({<field>: 1}):在指定字段上创建升序索引。db.<collection_name>.createIndex({<field>: -1}):在指定字段上创建降序索引。db.<collection_name>.dropIndex("<index_name>"):删除指定的索引。用户管理<tiangong type="reference" index="1-8">db.createUser({user: "<username>", pwd: "<password>", roles: ["<role>"]})</tiangong>:创建一个新用户。db.auth("<username>", "<password>"):验证用户的登录。show users:显示当前数据库中的所有用户。<tiangong type="reference" index="6-9">db.dropUser("<username>")</tiangong>:删除指定的用户。其他操作db.stats():显示当前数据库的状态信息。db.version():显示 MongoDB 服务器的版本号。db.getMongo():显示当前数据库的连接信息。这些命令是 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数据更新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中,自动增长的功能主要通过使用数据库的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"})
-
一、问题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
-
告警公司有个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 会尝试将这部分内存标记为空闲并返回给操作系统,而不是保留在进程的地址空间中以便快速重用。
-
什么是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 是一个基于分布式文件存储的 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 非常适合处理分布式数据,可以轻松扩展到多个节点,以处理大量的数据负载。而传统数据库通常在复杂的事务处理方面表现得更加优秀,例如多个操作的集合,以确保数据完整性和一致性。
-
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即可。
-
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啊?弄了半天整不明白啊。用了linux 的安装方法也不行。
-
【功能模块】obs对象存储,并行文件系统【操作步骤&问题现象】1、将mongdb的数据路径放在并行文件系统中2、启动mongodb,日志的预加载文件写入速度每秒128K,有没有办法提速。我知道obs不适合数据库这类零碎文件存储,但想试试看。【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
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 这样的老牌公司,竞争可能会非常激烈。特别是与传统数据库之间,这是一场事关数据库市场演变的竞争,我们期待竞争格局的演变。
上滑加载中
推荐直播
-
探秘仓颉编程语言:华为开发者空间的创新利器
2025/02/22 周六 15:00-16:30
华为云讲师团
本期直播将与您一起探秘颉编程语言上线华为开发者空间后,显著提升开发效率,在智能化开发支持、全场景跨平台适配能力、工具链与生态完备性、语言简洁与高性能特性等方面展现出的独特优势。直播看点: 1.java转仓颉的小工具 2.仓颉动画三方库lottie 3.开发者空间介绍及如何在空间用仓颉编程语言开发
回顾中 -
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
去报名 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签