什么是MongoDB数据库

发布时间: 2024-01-10 15:48:06 阅读量: 55 订阅数: 38
# 1. 介绍MongoDB数据库 ## 1.1 MongoDB的起源和发展历程 MongoDB是一种开源的文档数据库,于2009年由10gen公司推出,并于2013年更名为MongoDB Inc。它是一项以文档为基础的NoSQL数据库,旨在提供灵活的数据模型、高性能的读写操作和简单的水平扩展。 起初,MongoDB主要用于Web应用领域,以应对传统关系型数据库(如MySQL)无法满足的大数据处理和高并发访问需求。在发展过程中,MongoDB逐渐得到了社区的广泛认可和应用,并成为当今最流行的NoSQL数据库之一。 ## 1.2 MongoDB的特点和优势 MongoDB拥有许多独特的特点和优势,使其在众多数据库中脱颖而出: - **灵活的数据模型**:MongoDB采用了BSON(二进制JSON)格式存储数据,可以方便地存储和查询各种复杂的数据结构,比如嵌套文档、数组等。 - **高性能的读写操作**:MongoDB通过将数据存储在内存中,以及使用索引来提高查询效率。此外,MongoDB还支持水平扩展,可以将数据分布在多个节点上,提高了系统的负载能力和性能。 - **强大的查询功能**:MongoDB提供了丰富的查询操作符,可以灵活地进行数据过滤、排序、分组和聚合等操作。同时,它还支持全文搜索和地理空间查询,方便处理各种复杂的查询需求。 - **简单的水平扩展**:MongoDB的分片机制可以将数据分布在多个节点上,实现数据的水平扩展。这使得MongoDB可以轻松应对数据量的增长和高并发的访问需求。 - **强大的工具支持**:MongoDB提供了很多强大的工具,如MongoShell、Robomongo和MongoDB Compass,用于管理和监控数据库的运行状态,使开发和运维工作更加便捷。 综上所述,MongoDB以其灵活性、性能和易用性等特点,成为许多应用开发者和企业选择的首选数据库之一。在接下来的章节中,我们将详细介绍MongoDB的架构、功能和应用场景,帮助读者更好地理解和应用这一强大的数据库技术。 # 2. MongoDB数据库架构 MongoDB是一个面向文档的NoSQL数据库管理系统,具有高性能、高可用性和易扩展等特点。在本章节中,我们将深入探讨MongoDB数据库的架构。 ### 2.1 MongoDB的数据模型 MongoDB采用BSON(Binary JSON)文档数据模型,类似于JSON格式,但支持更多的数据类型,例如日期、正则表达式、二进制数据等。每个文档都有一个唯一的\_id字段作为主键,文档可以嵌套其他文档或数组。 ```python # Python示例代码:插入一个文档 import pymongo client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["mydatabase"] collection = db["mycollection"] doc = {"_id": 1, "name": "Alice", "age": 25, "email": "alice@example.com"} result = collection.insert_one(doc) print(result.inserted_id) ``` **代码说明:** 上述代码使用Python的pymongo库插入了一个文档,其中\_id字段作为主键,并且演示了插入操作的返回值。 ### 2.2 MongoDB的集合和文档结构 MongoDB的数据以集合和文档的形式进行组织。集合类似于关系型数据库中的表,而文档则类似于表中的记录。每个文档可以有不同的字段,但通常在一个集合中,文档的字段都是相似的,这样有利于查询和索引。 ```java // Java示例代码:查询集合中的文档 MongoClient mongoClient = new MongoClient("localhost", 27017); MongoDatabase database = mongoClient.getDatabase("mydatabase"); MongoCollection<Document> collection = database.getCollection("mycollection"); Document query = new Document("name", "Alice"); FindIterable<Document> result = collection.find(query); for (Document doc : result) { System.out.println(doc.toJson()); } ``` **代码说明:** 上述代码使用Java的MongoDB驱动查询了集合中符合条件的文档,并打印出查询结果。 ### 2.3 MongoDB的索引和查询优化 MongoDB支持在字段上建立索引以提高查询效率,常见的索引类型包括单键索引、复合索引、文本索引等。合理使用索引可以加快查询速度,降低查询时的资源消耗。 ```javascript // JavaScript示例代码:创建索引并进行查询 db.mycollection.createIndex({name: 1}); // 查询命名为Alice的文档 db.mycollection.find({name: "Alice"}); ``` **代码说明:** 上述代码展示了在MongoDB中创建索引的方式,以及利用索引进行查询的操作。 通过对MongoDB的数据模型、集合和文档结构以及索引和查询优化的深入了解,我们可以更好地设计和优化MongoDB数据库的架构,提高数据存储和访问的效率。 接下来,我们将进入第三章,介绍MongoDB的主要功能。 # 3. MongoDB的主要功能 MongoDB作为一款NoSQL数据库,具有丰富的功能和灵活的数据处理方式。本章将介绍MongoDB的主要功能,涵盖数据的存储和读写操作、数据的更新和删除操作,以及MongoDB的聚合框架和数据处理能力。 #### 3.1 数据存储和读写操作 在MongoDB中,数据以文档的形式存储,文档是一个由字段和对应数值组成的键值对集合。MongoDB的存储引擎使用WIREDTIGER,具备高效的存储和压缩能力。下面是使用Python示例演示MongoDB的数据存储和读写操作: ```python # 连接MongoDB服务器 from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') # 选择数据库和集合 db = client['mydb'] collection = db['mycollection'] # 插入文档 doc = {'name': 'Alice', 'age': 25, 'country': 'USA'} collection.insert_one(doc) # 查询文档 result = collection.find_one({'name': 'Alice'}) print(result) ``` 上述示例代码首先使用`pymongo`库创建一个与MongoDB服务器的连接,然后选择特定的数据库和集合。接着,通过`insert_one()`方法插入一个文档,然后使用`find_one()`方法查询该文档并打印结果。 #### 3.2 数据的更新和删除操作 除了插入和查询操作,MongoDB还提供了丰富的功能来更新和删除文档。下面的示例演示了如何使用Python进行数据的更新和删除操作: ```python # 更新文档 collection.update_one({'name': 'Alice'}, {'$set': {'age': 26}}) # 删除文档 collection.delete_one({'name': 'Alice'}) ``` 上述示例代码使用`update_one()`方法对满足条件的文档进行更新操作,通过`delete_one()`方法对满足条件的文档进行删除操作。 #### 3.3 MongoDB的聚合框架和数据处理 MongoDB的聚合框架提供了强大的数据处理和分析能力,可以方便地对数据进行聚合、筛选、排序、分组等操作。下面的示例演示了如何使用Python进行数据的聚合操作: ```python # 聚合操作 pipeline = [ {'$match': {'country': 'USA'}}, {'$group': {'_id': '$name', 'count': {'$sum': 1}}}, {'$sort': {'count': -1}}, {'$limit': 5} ] result = collection.aggregate(pipeline) for doc in result: print(doc) ``` 上述示例代码使用`aggregate()`方法对集合中的文档进行聚合操作,通过一系列的管道操作来实现特定的数据处理需求。本示例中,我们使用`$match`对满足条件的文档进行筛选,使用`$group`进行分组统计,使用`$sort`进行排序,最后使用`$limit`限制结果数量。 通过上述示例代码,我们可以看到MongoDB的数据存储和读写操作、数据的更新和删除操作,以及MongoDB的聚合框架和数据处理能力。这些功能使得MongoDB成为处理大数据和复杂数据分析的强大工具。 本章节介绍了MongoDB的主要功能,包括数据的存储和读写操作、数据的更新和删除操作,以及MongoDB的聚合框架和数据处理能力。在实际应用中,可以根据具体需求灵活选择和使用这些功能来满足业务需求。 # 4. MongoDB的部署和管理 在本章中,我们将讨论MongoDB的部署和管理相关内容,包括安装和配置、集群和复制、监控和性能调优等方面。 #### 4.1 MongoDB的安装和配置 MongoDB的安装和配置是使用MongoDB的第一步,下面是使用MongoDB的详细步骤: 1. 下载MongoDB安装包 - 访问官方网站下载适合您操作系统的MongoDB安装包。 2. 安装MongoDB - 打开安装包并按照提示进行安装。 3. 配置MongoDB - 配置数据存储路径、日志路径、端口等信息。 4. 启动MongoDB服务 - 启动MongoDB服务并验证是否成功启动。 5. 连接MongoDB - 使用mongo shell或者编程语言的驱动程序连接MongoDB。 ```python # Python连接MongoDB示例 from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.test_database ``` 这些是简单的安装和配置MongoDB的步骤,您可以根据官方文档进一步了解更多配置选项和安装细节。 #### 4.2 MongoDB的集群和复制 MongoDB的集群和复制是实现高可用和横向扩展的重要手段,下面是MongoDB集群和复制的简要介绍: - 集群:通过复制集和分片实现数据的水平扩展和负载均衡。 - 复制:通过复制集实现数据的冗余备份和故障转移。 ```java // Java使用MongoDB的复制集示例 MongoClient mongoClient = new MongoClient("localhost", 27017); MongoClientOptions options = MongoClientOptions.builder().requiredReplicaSetName("myReplicaSet").build(); MongoClient replicasetClient = new MongoClient(Arrays.asList( new ServerAddress("localhost", 27017), new ServerAddress("localhost", 27018), new ServerAddress("localhost", 27019")), options); ``` #### 4.3 MongoDB的监控和性能调优 在生产环境中,监控和性能调优是至关重要的,下面是MongoDB监控和性能调优的关键点: - 监控工具:MongoDB提供了丰富的监控工具,如mongostat、mongotop等。 - 慢查询分析:通过慢查询日志和explain方法分析慢查询语句的性能瓶颈。 - 索引优化:合理设计和优化索引可以大幅提升查询性能。 ```javascript // JavaScript使用explain方法分析查询性能示例 db.collection.find({"status": "A"}).explain("executionStats"); ``` 以上是MongoDB的部署和管理的简要介绍,您可以根据实际需求深入学习和使用MongoDB的更多高级特性。 希望这些内容对您有所帮助! # 5. MongoDB在实际应用中的应用场景 #### 5.1 MongoDB在大数据存储和实时分析中的应用 MongoDB在大数据存储和实时分析中有着广泛的应用。其灵活的数据模型和强大的查询功能使得它成为处理大规模数据的理想选择。 在大数据存储方面,MongoDB的分布式架构和自动分片功能可以处理海量数据的存储和管理。它可以水平扩展,通过将数据分散到多个节点上,提高了存储的容量和性能。此外,MongoDB还支持副本集和故障转移,确保数据的高可用性和容错性。 在实时分析方面,MongoDB提供了强大的聚合框架和数据处理能力。通过使用聚合管道,可以对数据集合进行复杂的计算和分析操作。聚合管道可以串联多个阶段,包括过滤、分组、排序、计数等,实现复杂的数据处理需求。同时,MongoDB还支持全文搜索和地理位置索引,满足了实时分析中的不同场景需求。 #### 5.2 MongoDB在物联网和互联网应用中的应用 MongoDB在物联网和互联网应用中的应用非常广泛。由于其灵活的模式和可扩展性,它可以适应各种类型的传感器数据和用户生成的数据。 在物联网中,MongoDB可以用于存储和管理大量设备生成的数据。传感器数据通常具有不确定的结构和类型,MongoDB的文档模型可以轻松地处理这些数据。此外,MongoDB的实时查询和数据处理功能可以支持实时监控和预测分析等应用场景。 在互联网应用中,MongoDB可以用于存储用户生成的数据,如用户配置、评论和喜欢等。相比传统的关系型数据库,MongoDB具有更好的扩展性和性能。它可以处理高并发的读写请求,并提供快速的响应时间。此外,MongoDB还支持自动分片和负载均衡,能够应对不断增长的数据量和流量。 #### 5.3 MongoDB在企业业务系统中的应用实例 MongoDB在企业业务系统中也有着广泛的应用实例。它可以用于电子商务、客户关系管理、供应链管理等各种业务场景。 在电子商务领域,MongoDB可以用于存储商品信息、用户订单和交易记录等重要数据。其灵活的模式和索引功能可以方便地进行电商数据的存储和检索。此外,MongoDB的分布式架构和高可用性特性可以确保系统的稳定性和可靠性。 在客户关系管理方面,MongoDB可以存储客户信息、交互记录和市场营销数据等。其文档模型和查询功能可以灵活地适应不同类型的客户数据。此外,MongoDB的地理位置索引功能可以支持客户地理位置分析和定位服务。 在供应链管理方面,MongoDB可以存储供应商信息、库存数据和物流记录等。其聚合框架和实时查询功能可以支持供应链分析和调度优化。此外,MongoDB的事务功能可以确保数据的一致性和可靠性。 综上所述,MongoDB在实际应用中具有广泛的应用场景,在大数据存储和实时分析、物联网和互联网应用、企业业务系统等方面发挥着重要作用。 # 6. MongoDB数据库的未来发展趋势 MongoDB作为一种领先的NoSQL数据库技术,在数据存储和处理方面取得了显著的成功。然而,随着云计算和容器化技术的兴起,MongoDB数据库面临着一些新的挑战和机遇。本章将探讨MongoDB数据库的未来发展趋势,包括NoSQL技术的发展趋势和市场需求,MongoDB在云计算和容器化发展中的机遇和挑战,以及MongoDB数据库技术的创新和发展方向。 ### 6.1 NoSQL技术的发展趋势和市场需求 随着互联网应用的高速发展和大数据的日益增长,传统的关系型数据库在面对海量数据和高并发访问时逐渐显露出一些瓶颈。而NoSQL技术作为一种非关系型数据库技术,具有分布式存储、高可扩展性和灵活的数据模型等特点,正逐渐成为大数据时代的新宠。 在NoSQL技术的发展趋势方面,我们可以预见以下几个方面的趋势: - **多模型数据库**:NoSQL技术不再局限于单一的数据模型,而是提供了多种数据模型的选择,包括文档型数据库、键值型数据库、列式数据库和图数据库等。这样可以更好地满足不同应用场景的需求。 - **分布式存储**:随着数据量的增大,单机数据库很难满足高并发和高可扩展性的需求。分布式存储成为了不可或缺的功能,通过将数据分布在多个节点上,可以提高系统的吞吐量和可用性。 - **实时处理**:随着实时数据分析和实时决策的需求越来越迫切,NoSQL技术在实时处理方面也将有所突破,提供更快的数据读写能力和更低的延迟。 - **容器化支持**:容器化技术如Kubernetes的广泛应用,为数据库的部署和管理带来了新的机会。NoSQL数据库需要提供对容器化环境的良好支持,如自动伸缩、动态负载均衡等功能。 ### 6.2 MongoDB在云计算和容器化发展中的机遇和挑战 随着云计算和容器化技术的迅速发展,数据库的部署和管理模式也发生了很大的变化。MongoDB作为一种流行的NoSQL数据库,面临着以下机遇和挑战: - **弹性扩展**:云计算环境下,MongoDB可以通过自动化的资源分配和弹性扩展功能,提供更好的可伸缩性和高可用性,满足不同规模和负载的需求。 - **故障恢复**:容器化环境下,数据库的故障恢复和迁移变得更加复杂。MongoDB需要提供可靠的故障检测和自动恢复的机制,来应对容器的短暂性和易变性。 - **性能调优**:容器化环境下,资源利用率非常重要。MongoDB需要针对容器化环境进行性能调优,包括减少IO操作、提高查询速度和降低内存占用等方面的优化。 - **安全性**:云计算和容器化环境下,安全性也是一个重要关注点。MongoDB需要提供良好的安全策略和机制,以保护数据的机密性和完整性。 ### 6.3 MongoDB数据库技术的创新和发展方向 为了应对未来发展趋势和满足用户需求,MongoDB数据库需要不断进行创新和发展。以下是一些可能的创新和发展方向: - **更好的事务支持**:事务是关系型数据库的一个重要特性,在某些应用场景下非常重要。MongoDB可以通过改进事务支持,提供更好的一致性和并发性。 - **更强的数据一致性**:在分布式环境下,数据一致性是一个复杂的问题。MongoDB可以通过优化复制和分片算法,提供更强的数据一致性保证。 - **更高效的查询优化**:查询优化是数据库性能优化的关键。MongoDB可以通过改进查询引擎、增加索引类型和优化查询计划等方式,提高查询速度和性能。 - **更丰富的生态系统**:MongoDB可以通过与其他开源项目的集成,提供更丰富的生态系统。例如与Spark集成,实现实时大数据分析和处理的能力。 综上所述,MongoDB作为一种领先的NoSQL数据库技术,在未来的发展中面临着机遇和挑战。通过不断创新和发展,MongoDB有望进一步提升其在大数据存储和处理领域的地位,满足不断变化的用户需求。
corwn 最低0.47元/天 解锁专栏
买1年送1年
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

LI_李波

资深数据库专家
北理工计算机硕士,曾在一家全球领先的互联网巨头公司担任数据库工程师,负责设计、优化和维护公司核心数据库系统,在大规模数据处理和数据库系统架构设计方面颇有造诣。
专栏简介
本专栏名为《MongoDB数据库从入门到精通》,旨在帮助读者系统学习MongoDB数据库的知识和技能。专栏中包含了从MongoDB的基本概念到高级操作的全面内容。首先介绍了什么是MongoDB数据库,然后详细讲解了MongoDB的安装和配置教程,使读者能够迅速上手。接着,专栏深入探讨了MongoDB的CRUD操作入门、文档模型、查询操作进阶、条件查询和投影等核心内容,帮助读者建立起对MongoDB的扎实掌握。随后,专栏还包括了数据导入和导出、数据分片技术、事务管理、高级查询和索引优化、数据备份与恢复策略等实用主题,以及MongoDB的高可用和故障转移、安全性和权限管理等高级话题。最后,专栏还介绍了如何使用MongoDB进行实时数据处理、数据分析与聚合、地理位置查询、日志分析以及数据模型设计原则,帮助读者全面了解MongoDB数据库在实际应用中的各种场景和解决方案。
最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

Android二维码实战:代码复用与模块化设计的高效方法

![Android二维码扫描与生成Demo](https://www.idplate.com/sites/default/files/styles/blog_image_teaser/public/2019-11/barcodes.jpg?itok=gNWEZd3o) # 1. Android二维码技术概述 在本章,我们将对Android平台上二维码技术进行初步探讨,概述其在移动应用开发中的重要性和应用背景。二维码技术作为信息交换和移动互联网连接的桥梁,已经在各种业务场景中得到广泛应用。 ## 1.1 二维码技术的定义和作用 二维码(QR Code)是一种能够存储信息的二维条码,它能够以

全球高可用部署:MySQL PXC集群的多数据中心策略

![全球高可用部署:MySQL PXC集群的多数据中心策略](https://cache.yisu.com/upload/information/20200309/28/7079.jpg) # 1. 高可用部署与MySQL PXC集群基础 在IT行业,特别是在数据库管理系统领域,高可用部署是确保业务连续性和数据一致性的关键。通过本章,我们将了解高可用部署的基础以及如何利用MySQL Percona XtraDB Cluster (PXC) 集群来实现这一目标。 ## MySQL PXC集群的简介 MySQL PXC集群是一个可扩展的同步多主节点集群解决方案,它能够提供连续可用性和数据一致

【MATLAB随机信号处理】:噪声消除与估计技术的专家级教程

![【MATLAB随机信号处理】:噪声消除与估计技术的专家级教程](https://i0.hdslb.com/bfs/archive/e393ed87b10f9ae78435997437e40b0bf0326e7a.png@960w_540h_1c.webp) # 1. MATLAB随机信号处理基础 MATLAB在随机信号处理领域扮演着重要角色,它提供了一系列强大的工具和函数库,使得工程师能够高效地进行信号处理和分析。在本章节中,我们将介绍随机信号处理的基本概念,包括信号的分类、时域与频域的表示方法,以及如何利用MATLAB的基本函数来处理随机信号。 ## 1.1 随机信号处理概述 随机

【JavaScript人脸识别的用户体验设计】:界面与交互的优化

![JavaScript人脸识别项目](https://www.mdpi.com/applsci/applsci-13-03095/article_deploy/html/images/applsci-13-03095-g001.png) # 1. JavaScript人脸识别技术概述 ## 1.1 人脸识别技术简介 人脸识别技术是一种通过计算机图像处理和识别技术,让机器能够识别人类面部特征的技术。近年来,随着人工智能技术的发展和硬件计算能力的提升,JavaScript人脸识别技术得到了迅速的发展和应用。 ## 1.2 JavaScript在人脸识别中的应用 JavaScript作为一种强

【NLP新范式】:CBAM在自然语言处理中的应用实例与前景展望

![CBAM](https://ucc.alicdn.com/pic/developer-ecology/zdtg5ua724qza_672a1a8cf7f44ea79ed9aeb8223f964b.png?x-oss-process=image/resize,h_500,m_lfit) # 1. NLP与深度学习的融合 在当今的IT行业,自然语言处理(NLP)和深度学习技术的融合已经产生了巨大影响,它们共同推动了智能语音助手、自动翻译、情感分析等应用的发展。NLP指的是利用计算机技术理解和处理人类语言的方式,而深度学习作为机器学习的一个子集,通过多层神经网络模型来模拟人脑处理数据和创建模式

MATLAB时域分析:动态系统建模与分析,从基础到高级的完全指南

![技术专有名词:MATLAB时域分析](https://i0.hdslb.com/bfs/archive/9f0d63f1f071fa6e770e65a0e3cd3fac8acf8360.png@960w_540h_1c.webp) # 1. MATLAB时域分析概述 MATLAB作为一种强大的数值计算与仿真软件,在工程和科学领域得到了广泛的应用。特别是对于时域分析,MATLAB提供的丰富工具和函数库极大地简化了动态系统的建模、分析和优化过程。在开始深入探索MATLAB在时域分析中的应用之前,本章将为读者提供一个基础概述,包括时域分析的定义、重要性以及MATLAB在其中扮演的角色。 时域

Python算法实现捷径:源代码中的经典算法实践

![Python NCM解密源代码](https://opengraph.githubassets.com/f89f634b69cb8eefee1d81f5bf39092a5d0b804ead070c8c83f3785fa072708b/Comnurz/Python-Basic-Snmp-Data-Transfer) # 1. Python算法实现捷径概述 在信息技术飞速发展的今天,算法作为编程的核心之一,成为每一位软件开发者的必修课。Python以其简洁明了、可读性强的特点,被广泛应用于算法实现和教学中。本章将介绍如何利用Python的特性和丰富的库,为算法实现铺平道路,提供快速入门的捷径

故障恢复计划:机械运动的最佳实践制定与执行

![故障恢复计划:机械运动的最佳实践制定与执行](https://leansigmavn.com/wp-content/uploads/2023/07/phan-tich-nguyen-nhan-goc-RCA.png) # 1. 故障恢复计划概述 故障恢复计划是确保企业或组织在面临系统故障、灾难或其他意外事件时能够迅速恢复业务运作的重要组成部分。本章将介绍故障恢复计划的基本概念、目标以及其在现代IT管理中的重要性。我们将讨论如何通过合理的风险评估与管理,选择合适的恢复策略,并形成文档化的流程以达到标准化。 ## 1.1 故障恢复计划的目的 故障恢复计划的主要目的是最小化突发事件对业务的

MATLAB遗传算法与模拟退火策略:如何互补寻找全局最优解

![MATLAB遗传算法与模拟退火策略:如何互补寻找全局最优解](https://media.springernature.com/full/springer-static/image/art%3A10.1038%2Fs41598-023-32997-4/MediaObjects/41598_2023_32997_Fig1_HTML.png) # 1. 遗传算法与模拟退火策略的理论基础 遗传算法(Genetic Algorithms, GA)和模拟退火(Simulated Annealing, SA)是两种启发式搜索算法,它们在解决优化问题上具有强大的能力和独特的适用性。遗传算法通过模拟生物

拷贝构造函数的陷阱:防止错误的浅拷贝

![C程序设计堆与拷贝构造函数课件](https://t4tutorials.com/wp-content/uploads/Assignment-Operator-Overloading-in-C.webp) # 1. 拷贝构造函数概念解析 在C++编程中,拷贝构造函数是一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。它以相同类类型的单一引用参数为参数,通常用于函数参数传递和返回值场景。拷贝构造函数的基本定义形式如下: ```cpp class ClassName { public: ClassName(const ClassName& other); // 拷贝构造函数