结构化数据库是一种使用结构化查询语言(SQL)进行管理和操作的数据库,它们的数据存储方式是基于表格和列的。结构化数据库要求数据预先定义数据模式和结构,然后才能存储和查询数据。结构化数据库通常具有以下特点:
数据预定义:在存储数据之前,需要先定义数据结构和数据类型。这些定义通常存储在数据库的元数据中,并用于确保数据库中的数据一致性和完整性。
数据之间的关系:结构化数据库使用表格来存储数据,并且通常有多个表格之间的关系。通过在表格之间建立外键关系,可以在查询时轻松地检索相关数据。
SQL支持:结构化数据库使用SQL进行管理和查询。SQL是一种标准化的查询语言,能够使用户轻松地检索和操作数据。
ACID事务支持:结构化数据库支持ACID事务,确保数据的一致性和完整性。
常见的结构化数据库包括MySQL、Oracle、SQL Server等。结构化数据库主要用于事务性应用程序和数据处理应用程序,例如企业资源计划(ERP)和客户关系管理(CRM)系统。这些应用程序需要处理结构化数据,并且需要确保数据的一致性和完整性。
非结构化数据库是一种没有预定义数据结构的数据库,它们的数据存储方式是基于文档、键值对或图形的,不同的非结构化数据库使用的数据存储方式可能不同。非结构化数据库不需要事先定义数据结构,它们的数据可以动态添加和删除,非常适合存储大量复杂和多层次的数据。
非结构化数据库的特点如下:
数据灵活性:非结构化数据库的数据存储格式更灵活,可以存储各种类型的数据,包括文本、图像、音频、视频等。
高性能:非结构化数据库通常能够更快地访问和处理数据,因为它们的数据存储方式更为灵活,使得查询效率更高。
可扩展性:非结构化数据库通常可以更好地扩展,因为它们不需要预定义表结构。
没有固定查询语言:非结构化数据库没有像SQL一样的标准化查询语言,而是使用API和查询语句来访问和操作数据。
非结构化数据库可以分为几种不同的类型,包括:
文档数据库:文档数据库存储的是基于文档的数据,例如JSON或XML格式。文档数据库的查询通常是基于键值对的。常见的文档数据库包括MongoDB、Couchbase、RavenDB等。
键值数据库:键值数据库存储的是基于键值对的数据,通常用于缓存和存储大量的简单数据。常见的键值数据库包括Redis、Amazon DynamoDB、Riak等。
列式数据库:列式数据库将数据存储在列中,而不是行中,这使得它们能够快速地查询和分析大量数据。常见的列式数据库包括Apache Cassandra、HBase等。
图形数据库:图形数据库存储的是基于图形结构的数据,通常用于存储和查询关系和连接。常见的图形数据库包括Neo4j、ArangoDB等。
以下是常见的几种 NoSQL 数据库之间的对比:
| 特性 | MongoDB | Cassandra | Redis | Couchbase | HBase |
|---|---|---|---|---|---|
| 数据模型 | 文档型 | 列族型 | 键值型 | 文档型 | 列族型 |
| 支持 ACID 事务 | 支持 | 仅在单独的分区上支持 | 不支持 | 支持 | 不支持 |
| 数据分布 | 支持分片 | 支持分布式集群 | 不支持分片 | 支持分片 | 支持分布式集群 |
| 备份与恢复 | 支持备份和恢复 | 支持增量备份和快照 | 支持备份和恢复 | 支持备份和恢复 | 支持备份和恢复 |
| 索引 | 支持二级索引 | 支持二级索引 | 支持多种索引 | 支持二级索引 | 支持二级索引 |
| 适合场景 | 大数据量、高性能读写 | 分布式、高吞吐量写入 | 内存缓存、高速读写 | 强一致性、高可用性 | 适合实时读写大规模数据 |
以下是结构化数据库和非结构化数据库的对比表格:
| 特性 | 结构化数据库 | 非结构化数据库 |
|---|---|---|
| 数据模型 | 关系型模型,基于表格的结构 | 非关系型模型,没有固定的结构,可以是文档、键值、图形等 |
| 数据存储 | 通常使用 SQL 语言存储和检索数据 | 不使用 SQL 语言存储和检索数据 |
| 数据规模 | 适合处理小规模、高度结构化的数据 | 适合处理大规模、非结构化的数据 |
| 数据一致性 | 强一致性,可以保证数据的完整性和准确性 | 最终一致性,数据的一致性和准确性不能保证 |
| 数据处理 | 常用于在线事务处理(OLTP)场景 | 常用于在线分析处理(OLAP)场景 |
| 可扩展性 | 通常采用垂直扩展(增加更强大的硬件) | 通常采用水平扩展(增加更多的节点) |
| 代表性数据库 | MySQL、Oracle、SQL Server | MongoDB、Cassandra、Redis |
MongoDB是一种流行的文档型数据库管理系统,它是一个开源、跨平台的数据库系统,支持在分布式集群上进行横向扩展。MongoDB使用类似于JSON的BSON(二进制JSON)格式来存储数据,它支持复杂的查询和索引,可以处理大量数据并具有高可用性和自动分片等特性。MongoDB的灵活性和可扩展性使得它在各种不同的应用场景中被广泛使用,如Web应用程序、大数据、物联网等。
MongoDB的主要特点如下:
MongoDB官网的下载页面上下载本地版本的
MongoDB。以下是下载MongoDB本地版本的步骤:
打开MongoDB官网https://www.mongodb.com/try/download/community 点击“Download”进入下载页面。
在下载页面中,选择适合的操作系统(如Windows、macOS或Linux)和MongoDB的版本号。如果不确定应该选择哪个版本,可以选择最新版本。
选择需要下载的版本后,会看到两个可用的下载选项:MSI和ZIP。如果使用的是Windows操作系统,建议下载MSI版本。如果使用的是Linux或macOS操作系统,建议下载ZIP版本。
双击安装包mongodb-windows-x86_64-4.4.4-signed.msi进行安装,根据提示完成安装过程。
将MongoDB的安装目录添加到系统环境变量中。默认情况下,MongoDB会被安装到C:\Program Files\MongoDB\Server\目录下,其中是您所安装的MongoDB版本号。您可以按以下步骤将MongoDB的安装目录添加到系统环境变量中:
a. 右键单击“此电脑”(或“我的电脑”),选择“属性”。
b. 点击“高级系统设置”。
c. 在“系统属性”窗口中,点击“环境变量”。
d. 在“环境变量”窗口中,找到“系统变量”下的“Path”变量,双击打开。
e. 在“编辑环境变量”窗口中,点击“新建”。
f. 输入MongoDB的安装路径,例如C:\Program Files\MongoDB\Server\,然后点击“确定”。
打开命令提示符,输入以下命令以启动MongoDB:
mongod --dbpath C:\mongodb\data\db
其中,--dbpath参数指定MongoDB数据文件的存储路径。如果未指定该参数,则MongoDB会默认使用C:\data\db目录作为数据文件存储路径。
下载MongoDB的Zip格式包,例如mongodb-win32-x86_64-4.4.4.zip。
解压MongoDB的Zip格式包到一个目录,例如C:\mongodb。
将MongoDB的安装目录添加到系统环境变量中。您可以按以下步骤将MongoDB的安装目录添加到系统环境变量中:
a. 右键单击“此电脑”(或“我的电脑”),选择“属性”。
b. 点击“高级系统设置”。
c. 在“系统属性”窗口中,点击“环境变量”。
d. 在“环境变量”窗口中,找到“系统变量”下的“Path”变量,双击打开。
e. 在“编辑环境变量”窗口中,点击“新建”。
f. 输入MongoDB的安装路径,例如C:\mongodb\bin,然后点击“确定”。
打开命令提示符,输入以下命令以启动MongoDB:
mongod --dbpath C:\mongodb\data\db
其中,--dbpath参数指定MongoDB数据文件的存储路径。如果未指定该参数,则MongoDB会默认使用C:\data\db目录作为数据文件存储路径。
tar -zxvf mongodb-linux-x86_64-.tgz
其中是您下载的MongoDB版本号。
/usr/local/目录下,使用以下命令:sudo mv mongodb-linux-x86_64- /usr/local/mongodb
~/.bashrc或~/.bash_profile文件,并添加以下行:export PATH=/usr/local/mongodb/bin:$PATH
source ~/.bashrc
mongod --dbpath \home\data\mongodb
下面是一份mongod.conf的示例代码,包括了各个配置项的详细说明:
yamlCopy code# mongod.conf# 系统日志配置
systemLog:destination: file # 日志输出到文件path: /var/log/mongodb/mongod.log # 日志文件路径logAppend: true # 采用追加模式quiet: false # 关闭安静模式,开启详细日志输出# 网络配置
net:port: 27017 # 监听的端口号bindIp: 127.0.0.1 # 监听的IP地址,默认为所有可用IP地址# 存储引擎配置
storage:dbPath: /var/lib/mongodb # 数据文件存储路径engine: wiredTiger # 存储引擎# 进程管理配置
processManagement:fork: true # 是否在后台运行# 复制集配置
replication:replSetName: rs0 # 复制集名称# 安全认证配置
security:authorization: enabled # 启用认证机制
在这个示例中,我们配置了系统日志、网络、存储引擎、进程管理、复制集和安全认证等多个方面的配置项。具体说明如下:
/var/lib/mongodb,并使用了wiredTiger存储引擎。rs0。具体的配置项根据实际需求进行修改。修改mongod.conf文件后,需要重启MongoDB才能使新的配置生效。
数据库(Database)是 MongoDB 的最高级别的数据存储单位,可以包含多个集合(Collection),类似于关系型数据库中的数据库(Database)。
| 数据结构 | 描述 |
|---|---|
| 集合(Collection) | 每个数据库可以包含多个集合,类似Mysql的表 |
| 文档(Document) | 每个集合包含多个文档,文档是 MongoDB 的最小数据单元 |
| 字段(Field) | 每个文档包含多个字段,类似于关系型数据库中的列 |
集合(Collection):
在 MongoDB 中,集合(Collection)是一组文档(Document)的无序集合。与关系型数据库中的表(Table)相比,集合不需要提前定义结构(Schema),也不需要定义表之间的关系。在集合中可以存储各种不同结构的文档,这使得 MongoDB 数据模型非常灵活,适用于各种类型的应用场景。
MongoDB 中的集合类似于关系型数据库中的表,但有以下区别:
文档(Document):
文档(Document)是数据的基本单元,类似于关系型数据库中的行(Row)。文档是一个由字段和值组成的键值对(Key-Value Pair),可以存储各种不同的数据类型,例如字符串、整数、浮点数、布尔值、数组、日期等等。
与关系型数据库中的行相比,文档的结构非常灵活,可以随时添加或删除字段,也可以包含嵌套的文档和数组。这种灵活性使得 MongoDB 在处理非结构化数据时非常方便。
字段(Field):
在 MongoDB 中,一个文档(Document)就是一个数据记录,每个文档都由一个或多个字段(Field)组成。字段是文档中的最小单位,每个字段都包含一个键值对,键是字符串类型的字段名称,值可以是任何 BSON 数据类型,例如字符串、数字、布尔值、数组、日期时间等。
以下是 MongoDB 支持的常见数据类型以及它们的描述:
| 数据类型 | 描述 |
|---|---|
| String | 存储文本数据,最大长度为 16 MB |
| Integer | 存储整数,包括 32 位整数和 64 位整数 |
| Double | 存储浮点数 |
| Boolean | 存储布尔值 |
| Object | 存储嵌套文档 |
| Array | 存储数组 |
| Date | 存储日期和时间 |
| ObjectId | 存储文档的唯一标识符 |
| Binary | 存储二进制数据 |
| Regular Expression | 存储正则表达式 |
除了上述数据类型外,MongoDB 还支持一些高级数据类型,例如 GeoJSON、MinKey、MaxKey 等。这些数据类型在特定场景下会非常有用。
在 MongoDB 中,文档的字段类型是动态的,也就是说,在同一个集合中,不同的文档可以拥有不同的字段,而且这些字段的类型可以不同。这种灵活性使得 MongoDB 非常适合存储非结构化数据和半结构化数据。同时,这也带来了一些挑战,例如需要进行数据验证和数据一致性的管理。
MongoDB 4.4版本之前使用mongo来操作数据库,后期版本使用mongosh 。
mongosh 是 MongoDB 官方推出的命令行工具,支持 MongoDB 4.4 及更高版本,提供了更好的交互体验和更多的功能,例如语法高亮、自动完成、内置实用程序等。
mongosh下载地址https://www.mongodb.com/try/download/shell,下载完成之后解压后,保存到上面配置的安装目录下,或者按照自己的想法放到任意位置。
使用 mongosh 命令行工具连接 MongoDB 数据库,格式为:
mongosh mongodb://:@/
其中:
:用户名:密码:主机名或 IP 地址:要连接的数据库名称例如,连接本地 MongoDB 数据库可以使用以下命令:
mongosh mongodb://localhost/test
#或者直接使用
mongosh
使用以下命令可以查看 MongoDB 中的所有数据库:
show databases
# 或者
show dbs
使用以下命令可以切换当前数据库:
use
例如,切换到名为 mydb 的数据库:
use mydb
使用以下命令可以查看当前数据库中的所有集合:
show collections
使用以下命令可以向集合中插入一条文档:
db..insertOne()
其中:
:集合名称:要插入的文档数据,格式为 JSON 对象例如,向名为 users 的集合中插入一条文档:
db.users.insertOne({ name: 'Alice', age: 30 })
在 mongosh 中进行批量插入数据可以使用 insertMany() 方法。例如,插入多个文档到 test 数据库中的 students 集合中:
db.users.insertMany([{ name: "Alice", age: 20, gender: "female" },{ name: "Bob", age: 21, gender: "male" },{ name: "Charlie", age: 19, gender: "male" }
])
上述代码将会向 users集合中插入三个文档,每个文档都包含 name、age 和 gender 三个字段。insertMany() 方法可以接受一个包含多个文档的数组作为参数,并且会返回一个包含插入结果的对象。
{acknowledged: true,insertedIds: {'0': ObjectId("6405aa49d335c2829403f6a2"),'1': ObjectId("6405aa49d335c2829403f6a3"),'2': ObjectId("6405aa49d335c2829403f6a4")}
}
使用以下命令可以查询集合中的文档:
db..find()
其中:
:集合名称:查询条件,格式为 JSON 对象例如,查询名为 Alice 的文档:
db.users.find({ name: 'Alice' })
db.users.find({ })
[{ _id: ObjectId("6405a63ed335c2829403f6a1"), name: 'Alice', age: 30 },{_id: ObjectId("6405aa49d335c2829403f6a2"),name: 'Alice',age: 20,gender: 'female'},{_id: ObjectId("6405aa49d335c2829403f6a3"),name: 'Bob',age: 21,gender: 'male'},{_id: ObjectId("6405aa49d335c2829403f6a4"),name: 'Charlie',age: 19,gender: 'male'}
]
使用以下命令可以更新集合中的文档:
updateOne() 是 MongoDB 提供的更新单个文档的方法。
语法:
db.collection.updateOne(,,{upsert: ,writeConcern: ,collation: }
)
参数说明:
:查询需要更新的文档的筛选条件。
常用的筛选符号如下:
$eq: 匹配等于指定值的文档。$ne: 匹配不等于指定值的文档。$gt: 匹配大于指定值的文档。$gte: 匹配大于或等于指定值的文档。$lt: 匹配小于指定值的文档。$lte: 匹配小于或等于指定值的文档。$in: 匹配指定数组中任意值的文档。$nin: 不匹配指定数组中任意值的文档。$and: 逻辑与,同时满足多个条件。$or: 逻辑或,满足多个条件之一。$not: 反转筛选条件,匹配不符合条件的文档。$nor: 逻辑非或,不满足多个条件之一。:指定如何更新文档。
upsert:可选,如果设置为 true,当查询条件的文档不存在时,会创建一个新文档。默认为 false。
writeConcern:可选,指定写入操作的写入安全性。
collation:可选,指定语言特定的比较规则。
例如,将名为 Alice 的文档的年龄更新为 31:
db.users.updateOne({ name: 'Alice' }, { $set: { age: 31 } })
updateMany()是MongoDB用于更新多个文档的方法,可以将一个或多个文档的字段值更新为指定的值,或者使用更新操作符进行更新。
语法:
db.collection.updateMany(,,{upsert: ,writeConcern: ,collation: ,arrayFilters: [ , ... ]}
)
参数说明:
filter:指定更新文档的条件,与find方法的query参数类似。
update:指定要更新的文档字段及值,可以使用更新操作符。
upsert:可选,如果设置为true,表示如果没有符合条件的文档则插入新的文档,默认为false。
writeConcern:可选,指定写入操作的安全级别。
collation:可选,指定对文档进行排序、大小写不敏感的比较和字符映射的规则。
arrayFilters:可选,如果更新的文档中包含嵌套数组,则使用该参数指定更新哪些子文档。
update 更新操作符:
$set:用于指定更新字段及其值。$unset:用于从文档中删除一个或多个字段。$inc:用于增加或减少一个数字型字段的值。$push:用于将一个值添加到数组字段中。$addToSet:用于将一个唯一的值添加到数组字段中。$pop:用于从数组字段中删除第一个或最后一个元素。$pull:用于从数组字段中删除指定的元素。$rename:用于重命名一个字段。示例:
将集合users中年龄为25岁的用户的姓名改为“Tom”:
db.users.updateMany({ age: 25 },{ $set: { name: "Tom" } }
)
将集合users中年龄为25岁的用户的年龄加1:
db.users.updateMany({ age: 25 },{ $inc: { age: 1 } }
)
将集合users中所有用户的年龄减1:
db.users.updateMany({},{ $inc: { age: -1 } }
)
deleteOne(filter, options) 方法删除集合中匹配过滤条件的单个文档。如果多个文档匹配,只删除第一个匹配的文档。
db.collection.deleteOne(,{writeConcern: ,collation: }
)
:(可选)删除条件,表示要删除的文档。writeConcern:(可选)写入操作的写入安全性级别。collation:(可选)指定要用于字符串比较的规则。示例:
db.users.deleteOne({name: "John"})
deleteMany(filter, options) 方法从集合中删除匹配过滤条件的多个文档。
db.collection.deleteMany(,{writeConcern: ,collation: }
)
:(可选)删除条件,表示要删除的文档。writeConcern:(可选)写入操作的写入安全性级别。collation:(可选)指定要用于字符串比较的规则。示例:
db.users.deleteMany({age: {$lt: 18}})
在进行删除操作时,需要小心,因为它是永久性操作,一旦删除,数据将无法恢复。在删除之前,建议创建数据备份或在操作之前进行确认。
Java 可以通过 MongoDB 官方提供的 Java 驱动程序(MongoDB Java Driver)来操作 MongoDB 数据库。
导入MongoDB Java Driver库文件
org.mongodb mongodb-driver-sync 4.7.1
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;public class MongoDBExample {public static void main(String[] args) {// 创建 MongoClient 对象,并连接到 MongoDB 服务器MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");// 选择要操作的数据库MongoDatabase database = mongoClient.getDatabase("mydb");// 选择要操作的集合MongoCollection collection = database.getCollection("mycollection");// 插入文档Document doc1 = new Document("name", "Alice").append("age", 25);Document doc2 = new Document("name", "Bob").append("age", 30);collection.insertMany(Arrays.asList(doc1, doc2));// 关闭连接mongoClient.close();}}
这个程序会连接到本地 MongoDB 服务器,并在名为 “mydb” 的数据库中的 “mycollection” 集合中插入两个文档,其中一个文档包含 “name” 和 “age” 两个字段,另一个文档也包含这两个字段。然后关闭连接。
Document doc = new Document("name", "John Doe").append("age", 30).append("email", "johndoe@example.com");
collection.insertOne(doc);
Document result = collection.find(Filters.eq("name", "John Doe")).first();
Filters类提供了很多静态方法,这些方法可以用来创建各种查询条件,如相等、不相等、小于、大于等比较运算符、逻辑运算符(与、或、非)等。
下面是一些常用的Filters静态方法:
eq(String fieldName, Object value):相等比较,返回符合指定字段等于指定值的文档。
ne(String fieldName, Object value):不等比较,返回符合指定字段不等于指定值的文档。
gt(String fieldName, Object value):大于比较,返回符合指定字段大于指定值的文档。
gte(String fieldName, Object value):大于等于比较,返回符合指定字段大于等于指定值的文档。
lt(String fieldName, Object value):小于比较,返回符合指定字段小于指定值的文档。
lte(String fieldName, Object value):小于等于比较,返回符合指定字段小于等于指定值的文档。
and(Bson... filters):逻辑与运算符,返回符合所有指定查询条件的文档。
or(Bson... filters):逻辑或运算符,返回符合任意指定查询条件的文档。
not(Bson filter):逻辑非运算符,返回符合指定查询条件取反后的文档。
regex() :正则查询,用于在查询中匹配指定的正则表达式。
Bson query = Filters.and(Filters.eq("name", "John"),Filters.gt("age", 18)
);
// Execute the query
FindIterable results = collection.find(query);
这个查询将返回所有 name 字段等于 “John” 且 age 字段大于 18 的文档。
collection.updateOne(Filters.eq("name", "John Doe"), new Document("$set", new Document("age", 31)));
collection.deleteOne(Filters.eq("name", "John Doe"));
FileWriter writer = new FileWriter("d:\\output.txt");
MongoCursor cursor = collection.find().projection(Projections.exclude("_id" )).cursor();
JsonWriterSettings settings = JsonWriterSettings.builder().indent(false).build();
while (cursor.hasNext()) {Document document = cursor.next();System.out.println(document.toJson(settings));writer.write(document.toJson() + "\n");
}
writer.close();
Projections是MongoDB驱动程序中的一个类,用于在查询结果中只返回指定的字段,而不是返回整个文档。
常用的Projections方法及其含义如下:
include:指定返回结果中需要包含哪些字段。如果还需要包含_id字段,则需要使用excludeId()方法。exclude:指定返回结果中不需要包含哪些字段。excludeId:指定返回结果中不需要包含_id字段。elemMatch:指定返回结果中数组类型的字段只返回满足条件的元素,条件使用Filters.eq、Filters.gt、Filters.lt等方法构建。下面是一个使用Projections进行投影查询的例子:
MongoCollection collection = database.getCollection("mycollection");
Bson filter = Filters.eq("age", 30);
Bson projection = Projections.fields(Projections.include("name", "age"), Projections.excludeId());
FindIterable result = collection.find(filter).projection(projection);
在上述代码中,通过Projections.fields()方法指定了需要返回的字段(name和age),并且排除了_id字段。最后使用projection()方法将该投影查询应用于find()方法的结果中。
JsonWriterSettings 是 MongoDB Java Driver 中的一个类,用于配置 JsonWriter 的行为。JsonWriter 是将 MongoDB 文档序列化为 JSON 格式的类。在 MongoDB 4.4 以前的版本中,JsonWriter 与 BsonWriter 是分开的,分别用于序列化为 JSON 格式和 BSON 格式。而在 MongoDB 4.4 以后的版本中,它们被合并为一个类,名为 BsonDocumentWriter,并且支持将文档序列化为多种格式。
以下是 JsonWriterSettings 中一些重要的属性:
indent:是否缩进输出,默认为 false。indentCharacters:缩进使用的字符,默认为空格。newLineCharacters:换行使用的字符,默认为系统默认的换行符。maxLength:JSON 字符串最大长度,默认为 0,表示不限制长度。escapeNonAsciiCharacters:是否将非 ASCII 字符进行转义,默认为 false。dateTimeConverter:日期转换器,默认为 DefaultDateTimeConverter,可以通过实现 DateTimeConverter 接口来实现自定义的日期转换。outputMode:输出模式,默认为 STRICT,可以选择 RELAXED 或 SHELL 模式。使用 JsonWriterSettings,可以对 MongoDB 文档的序列化行为进行灵活的配置,以满足不同的需求。
下一篇:OSPF路由协议总结