-
使用 Java 连接 MongoDB 数据库通常需要借助 MongoDB 官方提供的 Java 驱动程序 mongodb-driver-sync(同步驱动)或 mongodb-driver-reactivestreams(异步驱动)。以下是使用 Java 同步驱动连接 MongoDB 的详细步骤:1. 添加 Maven 依赖如果使用 Maven 构建项目,可以在 pom.xml 文件中添加 MongoDB 驱动依赖:<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.10.2</version> <!-- 检查最新版本 --> </dependency> 如果使用 Gradle,可以添加以下依赖:implementation 'org.mongodb:mongodb-driver-sync:4.10.2' 2. 使用 Java 连接 MongoDB以下是使用 Java 同步驱动连接 MongoDB 的基本步骤:代码示例import com.mongodb.MongoClientSettings; import com.mongodb.ServerAddress; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.Collections; public class MongoDBExample { public static void main(String[] args) { // 1. 创建 MongoDB 客户端 try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { // 2. 选择数据库(如果不存在,会在插入数据时自动创建) MongoDatabase database = mongoClient.getDatabase("my_database"); // 3. 选择集合(类似于关系型数据库中的表,如果不存在,会在插入数据时自动创建) MongoCollection<Document> collection = database.getCollection("my_collection"); // 4. 插入一条文档(记录) Document document = new Document("name", "Alice") .append("age", 25) .append("city", "New York"); collection.insertOne(document); System.out.println("文档插入成功"); // 5. 查询文档 Document foundDocument = collection.find(new Document("name", "Alice")).first(); System.out.println("查询到的文档: " + foundDocument.toJson()); } catch (Exception e) { e.printStackTrace(); } } } 3. 详细说明1. 创建 MongoDB 客户端使用 MongoClients.create() 方法创建客户端。参数可以是:MongoDB URI:如 mongodb://localhost:27017/(本地默认地址)。连接选项:可以传递 MongoClientSettings 对象,配置连接池、超时等。2. 选择数据库使用 mongoClient.getDatabase("database_name") 选择数据库。如果数据库不存在,在插入数据时会自动创建。3. 选择集合使用 database.getCollection("collection_name") 选择集合。如果集合不存在,在插入数据时会自动创建。4. 插入数据使用 collection.insertOne() 插入单条文档。使用 collection.insertMany() 插入多条文档。5. 查询数据使用 collection.find() 查询文档,返回一个 FindIterable 对象。使用 .first() 获取第一条匹配的文档。4. 示例:插入和查询多条文档import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.Arrays; public class MongoDBExample { public static void main(String[] args) { try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase database = mongoClient.getDatabase("my_database"); MongoCollection<Document> collection = database.getCollection("my_collection"); // 插入多条文档 collection.insertMany(Arrays.asList( new Document("name", "Bob").append("age", 30).append("city", "Los Angeles"), new Document("name", "Charlie").append("age", 35).append("city", "Chicago") )); System.out.println("多条文档插入成功"); // 查询多条文档 for (Document doc : collection.find()) { System.out.println(doc.toJson()); } } catch (Exception e) { e.printStackTrace(); } } } 5. 常见操作更新文档使用 collection.updateOne() 更新单条文档。使用 collection.updateMany() 更新多条文档。// 更新单条文档 collection.updateOne( new Document("name", "Alice"), new Document("$set", new Document("age", 26)) ); // 更新多条文档 collection.updateMany( new Document("city", "New York"), new Document("$set", new Document("country", "USA")) ); 删除文档使用 collection.deleteOne() 删除单条文档。使用 collection.deleteMany() 删除多条文档。// 删除单条文档 collection.deleteOne(new Document("name", "Alice")); // 删除多条文档 collection.deleteMany(new Document("age", new Document("$lt", 30))); 聚合查询使用 collection.aggregate() 进行复杂的聚合操作。import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Sorts; import org.bson.conversions.Bson; import java.util.List; List<Bson> pipeline = Arrays.asList( Aggregates.group("$city", new Document("total_age", new Document("$sum", "$age")), new Document("count", new Document("$sum", 1)) ), Aggregates.sort(Sorts.ascending("total_age")) ); for (Document doc : collection.aggregate(pipeline)) { System.out.println(doc.toJson()); } 6. 注意事项MongoDB URI 格式:本地连接:mongodb://localhost:27017/远程连接:mongodb://username:password@host:port/配置选项:mongodb://host:port/?replicaSet=rs0&readPreference=secondaryPreferred异常处理:使用 try-with-resources 确保连接关闭。捕获 MongoException 或其他运行时异常。性能优化:使用连接池(pymongo 和 Java 驱动默认支持)。避免频繁打开和关闭连接。驱动版本:确保使用与 MongoDB 服务器兼容的驱动版本。通过以上步骤,你可以使用 Java 轻松连接和操作 MongoDB 数据库。根据业务需求,可以进一步探索 MongoDB 的高级功能,如索引、分片、复制集等。
-
使用 Python 连接 MongoDB 数据库通常需要借助 MongoDB 官方提供的驱动程序 pymongo。以下是使用 pymongo 连接 MongoDB 的详细步骤:1. 安装 pymongo首先,确保安装了 pymongo 库。如果尚未安装,可以通过 pip 安装:pip install pymongo2. 连接 MongoDB以下是使用 pymongo 连接 MongoDB 的基本步骤:代码示例from pymongo import MongoClient # 1. 创建 MongoDB 客户端 client = MongoClient("mongodb://localhost:27017/") # 默认连接到本地 MongoDB # 如果需要连接远程 MongoDB,可以指定用户名、密码和地址,例如: # client = MongoClient("mongodb://username:password@host:port/") # 2. 选择数据库(如果不存在,会在插入数据时自动创建) db = client["my_database"] # 3. 选择集合(类似于关系型数据库中的表,如果不存在,会在插入数据时自动创建) collection = db["my_collection"] # 4. 插入一条文档(记录) document = {"name": "Alice", "age": 25, "city": "New York"} result = collection.insert_one(document) print(f"插入的文档 ID: {result.inserted_id}") # 5. 查询文档 found_document = collection.find_one({"name": "Alice"}) print("查询到的文档:", found_document) # 6. 关闭连接(可选,`pymongo` 会自动管理连接池) client.close() 3. 详细说明1. 创建客户端MongoClient 是 pymongo 提供的核心类,用于连接 MongoDB 服务器。参数可以是:MongoDB URI:如 mongodb://localhost:27017/(本地默认地址)。用户名和密码:如 mongodb://username:password@host:port/。连接选项:可以通过 MongoClient 的其他参数配置连接池、超时等。2. 选择数据库使用 client["database_name"] 选择数据库。如果数据库不存在,在插入数据时会自动创建。3. 选择集合使用 db["collection_name"] 选择集合。如果集合不存在,在插入数据时会自动创建。4. 插入数据使用 insert_one() 插入单条文档。使用 insert_many() 插入多条文档。5. 查询数据使用 find_one() 查询单条文档。使用 find() 查询多条文档(返回一个游标对象,可以迭代访问)。6. 关闭连接虽然 pymongo 会自动管理连接池,但在某些情况下(如脚本运行结束后),可以显式调用 client.close() 关闭连接。4. 示例:插入和查询多条文档from pymongo import MongoClient # 创建客户端 client = MongoClient("mongodb://localhost:27017/") db = client["my_database"] collection = db["my_collection"] # 插入多条文档 documents = [ {"name": "Bob", "age": 30, "city": "Los Angeles"}, {"name": "Charlie", "age": 35, "city": "Chicago"} ] result = collection.insert_many(documents) print(f"插入的文档 ID 列表: {result.inserted_ids}") # 查询多条文档 for doc in collection.find({"age": {"$gt": 25}}): # 查询年龄大于 25 的文档 print(doc) # 关闭连接 client.close() 5. 常见操作更新文档使用 update_one() 更新单条文档。使用 update_many() 更新多条文档。# 更新单条文档 collection.update_one({"name": "Alice"}, {"$set": {"age": 26}}) # 更新多条文档 collection.update_many({"city": "New York"}, {"$set": {"country": "USA"}}) 删除文档使用 delete_one() 删除单条文档。使用 delete_many() 删除多条文档。# 删除单条文档 collection.delete_one({"name": "Alice"}) # 删除多条文档 collection.delete_many({"age": {"$lt": 30}}) 聚合查询使用 aggregate() 进行复杂的聚合操作(如分组、统计)。from pymongo import ASCENDING pipeline = [ {"$group": {"_id": "$city", "total_age": {"$sum": "$age"}, "count": {"$sum": 1}}}, {"$sort": {"total_age": ASCENDING}} ] for result in collection.aggregate(pipeline): print(result) 6. 注意事项MongoDB URI 格式:本地连接:mongodb://localhost:27017/远程连接:mongodb://username:password@host:port/配置选项:mongodb://host:port/?replicaSet=rs0&readPreference=secondaryPreferred异常处理:使用 try-except 捕获连接错误或操作错误:try: client = MongoClient("mongodb://localhost:27017/") except Exception as e: print(f"连接失败: {e}") 性能优化:使用连接池(pymongo 默认支持)。避免频繁打开和关闭连接。通过以上步骤,你可以使用 Python 轻松连接和操作 MongoDB 数据库。根据业务需求,可以进一步探索 MongoDB 的高级功能,如索引、分片、复制集等。
-
MongoDB 简介MongoDB 是一个基于 文档存储 的 NoSQL 数据库,以 BSON(Binary JSON) 格式存储数据,支持动态模式设计,具有高扩展性和灵活性。它属于 面向文档的数据库,适合处理非结构化或半结构化数据,广泛应用于大数据、实时分析、内容管理、物联网(IoT)等场景。MongoDB 与传统关系型数据库(如 MySQL、PostgreSQL)的区别1. 数据模型MongoDB文档存储:数据以 BSON 文档 形式存储(类似 JSON 格式),每个文档可以有不同的字段结构(动态模式)。集合(Collection):文档的集合,类似关系型数据库中的表,但无需预定义模式。示例:{ "_id": ObjectId("..."), "name": "Alice", "age": 25, "address": { "city": "New York", "zip": "10001" }, "hobbies": ["reading", "traveling"] } 传统关系型数据库表结构:数据存储在预定义的表中,每行(记录)具有相同的列(字段)。表(Table):关系型数据库的核心,字段需提前定义(如 VARCHAR(255)、INT 等)。示例: idnameagecityzip1Alice25New York100012. 模式(Schema)MongoDB无模式(Schema-less):文档可以自由添加或删除字段,无需预定义结构。灵活性:适合快速迭代开发,适应需求变化。传统关系型数据库强模式(Schema-based):表结构需提前定义,修改模式(如添加列)通常需要执行复杂的 ALTER TABLE 操作。一致性:确保数据结构统一,避免数据不一致。3. 查询语言MongoDBMongoDB 查询语言(MQL):基于 JSON 的查询语法,支持嵌套查询、数组操作、正则表达式等。示例:db.users.find({ age: { $gt: 20 }, hobbies: "reading" }) 传统关系型数据库SQL(结构化查询语言):基于关系代数,支持连接(JOIN)、聚合函数(如 SUM、AVG)等。示例:SELECT * FROM users WHERE age > 20 AND hobbies LIKE '%reading%'; 4. 扩展性MongoDB水平扩展:通过 分片(Sharding) 实现,数据分布在多个节点上,支持 PB 级数据存储。自动分片:MongoDB 自动管理数据分布,无需手动干预。传统关系型数据库垂直扩展:通过增加硬件资源(如 CPU、内存)提升性能,扩展性有限。水平扩展:需要手动实现分库分表,复杂度高。5. 事务支持MongoDB多文档事务:从 4.0 版本 开始支持跨文档的事务,但仅限于 副本集(Replica Set) 或 分片集群。传统关系型数据库ACID 事务:天然支持多表事务,确保数据一致性和完整性。6. 数据一致性MongoDB最终一致性:默认情况下,副本集的读操作可能从从节点读取,数据可能存在短暂延迟。强一致性:可通过 读写关注(Read/Write Concern) 配置实现强一致性。传统关系型数据库强一致性:所有操作立即反映在所有节点上,数据一致性高。7. 适用场景MongoDB非结构化或半结构化数据:如日志、用户行为数据、IoT 数据。快速开发:无需预定义模式,适合敏捷开发。分布式系统:天然支持分片和复制,适合大规模数据存储。传统关系型数据库结构化数据:如金融数据、订单系统、用户管理系统。复杂事务:需要强一致性和多表关联的场景。BI 分析:SQL 查询和聚合函数强大,适合数据分析。总结对比表特性MongoDB传统关系型数据库数据模型文档存储(BSON)表结构(关系型)模式无模式(Schema-less)强模式(Schema-based)查询语言MQL(基于 JSON)SQL扩展性水平扩展(分片)垂直扩展(硬件升级)事务支持多文档事务(4.0+)ACID 事务数据一致性最终一致性(可配置强一致性)强一致性适用场景非结构化数据、快速开发、分布式系统结构化数据、复杂事务、BI 分析结论选择 MongoDB:如果需要处理非结构化数据、快速迭代开发、或构建分布式系统。选择传统关系型数据库:如果需要强一致性、复杂事务支持、或进行数据分析。MongoDB 和传统关系型数据库并非替代关系,而是互补关系,应根据具体业务需求选择合适的工具。
-
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数据库。
上滑加载中