MongoDB:实现高性能的分布式数据库
安装 MongoDB:
访问 MongoDB 官方下载页面(www.mongodb.com/try/downloa… )来下载适用于你操作系统的安装包。然后,按照官方文档的说明进行安装。
安装centos7的版本 fastdl.mongodb.org/linux/mongo…
解压
tar -zxvf mongodb-linux-x86_64-rhel70-6.0.5.tgz
设置环境变量
export PATH=$PATH:<你机器MongoDB bin目录,如:/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.4.2/bin>
执行 source ~/.bashrc
在 MongoDB 4.4 及以后的版本中,MongoDB 数据库工具(如 mongo shell)与 MongoDB 服务器分为两个独立的软件包。刚才下载的是 MongoDB 服务器,但还没有 MongoDB 数据库工具。为了使用 mongo
命令,需要安装 MongoDB 数据库工具。
- 访问 MongoDB 数据库工具下载页面(www.mongodb.com/try/downloa… )并下载适用于你操作系统的软件包。 centos7用的是"RHEL / CentOS / Fedora / Suse 64-bit" 版本 downloads.mongodb.com/compass/mon…
安装
yum install mongodb-mongosh-1.8.2.x86_64.rpm
然后
mongosh
MongoDB 是一个开源的 NoSQL 数据库,它使用了灵活的文档数据模型,这意味着它可以存储各种结构的数据。MongoDB 使用 BSON(一种类似于 JSON 的二进制格式)来存储数据,并提供了丰富的查询和聚合功能。
接下来,我们将了解一些基本概念和操作:
-
数据库(Database):MongoDB 将数据存储在一个称为数据库的容器中。
-
集合(Collection):在数据库中,我们将具有相似结构的文档组织成集合。集合类似于关系型数据库中的表。
-
文档(Document):集合中的单个数据项称为文档。文档是 BSON 格式的数据,可以包含许多键值对。
接下来,我们将介绍一些基本的 CRUD(创建、读取、更新和删除)操作:
-
创建(Create):在 MongoDB 中,我们可以使用
insertOne()
或insertMany()
方法向集合中插入一个或多个文档。示例:
db.collectionName.insertOne({ key1: "value1", key2: "value2" });
-
读取(Read):使用
find()
方法查询集合中的文档。你可以添加查询条件来过滤结果。示例:
db.collectionName.find({ key1: "value1" });
-
更新(Update):使用
updateOne()
或updateMany()
方法更新一个或多个文档。你需要提供一个查询条件和一个更新操作符。示例:
db.collectionName.updateOne( { key1: "value1" }, { $set: { key2: "new_value2" } } );
-
删除(Delete):使用
deleteOne()
或deleteMany()
方法删除一个或多个文档。你需要提供一个查询条件。示例:
db.collectionName.deleteOne({ key1: "value1" });
MongoDB 提供了丰富的操作来满足各种数据操作需求。这里我们将详细介绍一些常用的操作,以及相应的示例:
-
创建(Create):
a. 插入单个文档(insertOne):
db.collectionName.insertOne({ name: "John Doe", age: 28, occupation: "Software Developer" });
b. 插入多个文档(insertMany):
db.collectionName.insertMany([ { name: "Jane Doe", age: 32, occupation: "Data Analyst" }, { name: "Mike Smith", age: 45, occupation: "Project Manager" } ]);
-
读取(Read):
a. 查询所有文档(find):
db.collectionName.find();
b. 根据条件查询文档(find with query):
db.collectionName.find({ age: { $gt: 30 } });
c. 查询单个文档(findOne):
db.collectionName.findOne({ name: "John Doe" });
d. 查询指定字段的文档(Projection):
db.collectionName.find({ age: { $gt: 30 } }, { name: 1, occupation: 1 });
-
更新(Update):
a. 更新单个文档(updateOne):
db.collectionName.updateOne( { name: "John Doe" }, { $set: { age: 29 } } );
b. 更新多个文档(updateMany):
db.collectionName.updateMany( { occupation: "Software Developer" }, { $inc: { age: 1 } } );
c. 替换单个文档(replaceOne):
db.collectionName.replaceOne( { name: "John Doe" }, { name: "John Doe", age: 29, occupation: "Software Engineer" } );
-
删除(Delete):
a. 删除单个文档(deleteOne):
db.collectionName.deleteOne({ name: "John Doe" });
b. 删除多个文档(deleteMany):
db.collectionName.deleteMany({ age: { $lt: 30 } });
-
聚合(Aggregation):
a. 使用聚合管道(Aggregation Pipeline):
db.collectionName.aggregate([ { $match: { age: { $gt: 30 } } }, { $group: { _id: "$occupation", count: { $sum: 1 } } }, { $sort: { count: -1 } } ]);
-
索引(Indexing):
a. 创建索引(createIndex):
db.collectionName.createIndex({ name: 1 });
b. 查看索引(getIndexes):
db.collectionName.getIndexes();
c. 删除索引(dropIndex):
db.collectionName.dropIndex("name_1");
MongoDB 提供了丰富的操作来对数据进行增删改查、索引管理、聚合等。以下是 MongoDB 的一些常用操作:
-
增加数据:
insertOne()
: 插入一条文档insertMany()
: 插入多条文档
-
查询数据:
find()
: 查询多条文档findOne()
: 查询一条文档count()
: 统计文档数量distinct()
: 查询不重复的值sort()
: 排序limit()
: 限制返回结果数量skip()
: 跳过指定数量的文档projection
: 选择返回的字段
-
更新数据:
updateOne()
: 更新一条文档updateMany()
: 更新多条文档replaceOne()
: 替换一条文档$set
: 更新指定字段$unset
: 删除指定字段$inc
: 增加指定字段的值$mul
: 乘以指定字段的值$rename
: 重命名字段
-
删除数据:
deleteOne()
: 删除一条文档deleteMany()
: 删除多条文档
-
索引管理:
createIndex()
: 创建索引dropIndex()
: 删除索引listIndexes()
: 列出所有索引reIndex()
: 重建索引
-
聚合操作:
aggregate()
: 聚合查询$match
: 筛选文档$group
: 分组文档$project
: 投影指定字段$unwind
: 展开数组字段$sort
: 排序$limit
: 限制结果数量$skip
: 跳过指定数量的文档$lookup
: 连接其他集合$bucket
: 按范围分组文档$facet
: 多阶段聚合
-
数据库和集合管理:
createCollection()
: 创建集合dropCollection()
: 删除集合renameCollection()
: 重命名集合stats()
: 获取集合统计信息listDatabases()
: 列出所有数据库use <dbname>
: 切换数据库dropDatabase()
: 删除数据库
这些操作只是 MongoDB 功能的一部分,实际上 MongoDB 提供了更多高级功能,如事务、数据验证、数据安全等。你可以在 MongoDB 官方文档(docs.mongodb.com/manual/)中找到… MongoDB 的详细信息。 以下是 MongoDB 操作的示例和解释:
- 增加数据:
// insertOne() - 向集合中插入一个文档
db.products.insertOne({name: "iPhone", price: 1000})
// insertMany() - 向集合中插入多个文档
db.products.insertMany([{name: "iPad", price: 500}, {name: "MacBook", price: 1500}])
- 查询数据:
// find() - 根据查询条件查找所有匹配的文档
db.products.find({name: "iPhone"})
// findOne() - 根据查询条件查找一个匹配的文档
db.products.findOne({name: "iPhone"})
// count() - 根据查询条件计算匹配文档的数量
db.products.count({name: "iPhone"})
// distinct() - 获取集合中指定字段的唯一值
db.products.distinct("name")
// sort() - 对查询结果进行排序
db.products.find().sort({price: 1}) // 1 表示升序,-1 表示降序
// limit() - 限制查询结果的数量
db.products.find().limit(5)
// skip() - 跳过查询结果的前 n 个文档
db.products.find().skip(5)
// projection - 选择需要返回的字段
db.products.find({}, {name: 1, _id: 0}) // 只返回 name 字段,不返回 _id 字段
- 更新数据:
// updateOne() - 更新一个匹配的文档
db.products.updateOne({name: "iPhone"}, {$set: {price: 1100}})
// updateMany() - 更新多个匹配的文档
db.products.updateMany({}, {$inc: {price: 100}}) // 将所有文档的 price 字段增加 100
- 删除数据:
// deleteOne() - 删除一个匹配的文档
db.products.deleteOne({name: "iPhone"})
// deleteMany() - 删除多个匹配的文档
db.products.deleteMany({price: {$lt: 500}})
- 索引:
// createIndex() - 为集合中的一个或多个字段创建索引
db.products.createIndex({name: 1}) // 为 name 字段创建升序索引
// getIndexes() - 获取集合的所有索引
db.products.getIndexes()
// dropIndex() - 删除指定索引
db.products.dropIndex("name_1")
- 聚合:
// 使用聚合管道进行复杂查询和数据处理
db.products.aggregate([
{$match: {price: {$gt: 1000}}},
{$group: {_id: "$name", total: {$sum: "$price"}}}
])
MongoDB与其他技术的集成
- MongoDB与关系型数据库
- 比较:MongoDB是一种NoSQL数据库,而关系型数据库是基于表格的数据模型。
- 适用场景:MongoDB通常用于需要扩展性和灵活性的应用程序,而关系型数据库通常用于需要数据完整性和事务支持的应用程序。
- 迁移数据:如果要从关系型数据库迁移到MongoDB,可以使用一些工具来实现。例如,可以使用MongoDB的mongodump和mongorestore命令行工具,或者使用第三方工具如mongoimport和mongify。
- MongoDB与Elasticsearch的集成
- 比较:MongoDB和Elasticsearch都是文档型数据库,但Elasticsearch更专注于全文搜索和实时分析。
- 适用场景:Elasticsearch通常用于需要高效的全文搜索和数据分析的应用程序,而MongoDB通常用于需要灵活的数据存储和查询的应用程序。
- 集成方法:MongoDB和Elasticsearch可以通过Elasticsearch的MongoDB River插件集成。这个插件可以在MongoDB和Elasticsearch之间建立一个实时同步的管道,将MongoDB的数据传输到Elasticsearch中进行全文搜索。另外,可以使用MongoDB的Change Streams API来捕获MongoDB的变更,并将其发送到Elasticsearch进行全文搜索和分析。
总结:
MongoDB的优势:
- 灵活性:MongoDB的文档型数据模型和动态模式允许开发人员灵活地存储和查询各种数据类型。
- 扩展性:MongoDB可以通过水平扩展集群来满足大量数据和高并发访问的需求。
- 性能:MongoDB通过索引和聚合框架等优化技术来提高查询性能和数据访问速度。
- 开发效率:MongoDB提供了丰富的查询语言和驱动程序,可以快速地开发和测试应用程序。
- 社区支持:MongoDB拥有一个活跃的社区,提供了大量的文档、教程和示例代码。
MongoDB的适用场景:
- Web应用程序:MongoDB的高可用性、可扩展性和性能优势使其成为Web应用程序的理想选择。
- 大数据分析:MongoDB的聚合框架和MapReduce功能使其成为大数据分析的有力工具。
- 实时分析:MongoDB的Change Streams和数据流能力,使其适用于实时分析和处理海量数据。
- 移动应用程序:MongoDB的轻量级驱动程序和云服务,使其适用于移动应用程序。
展望MongoDB的未来:
- 多云环境:MongoDB将继续加强其云服务和多云部署选项。
- 数据集成:MongoDB将继续加强其与其他技术和数据源的集成,如Elasticsearch、Apache Kafka、Apache Hadoop等。
- 人工智能:MongoDB将继续开发支持人工智能和机器学习的功能,如自然语言处理和图像识别等。
- 数据治理:MongoDB将继续加强其数据治理和合规性功能,如访问控制、数据加密和身份验证等。
转载自:https://juejin.cn/post/7231722969990381623