MongoDB(一)
文章目录
- 一、MongoDB
- 1、概述
- 2、官方版本
- 3、简要历史
- 4、主要特点
- 5、支持语言
- 二、怎么使用
- 1、连接MongoDB
- 2、基础命令使用
- 1. 创建数据库
- 2. 创建集合
- 3、新增一个数据
- 3、查看当前集合占用内存
- 4、到期时间14天
- 3、java基础使用案例
- 1、连接测试
- 2、新增日志测试
- 3、查询测试
- 参考文章
- 参考
注:java使用视角
一、MongoDB
1、概述
MongoDB 是一种可获取源代码、跨平台、面向文档的数据库程序(可以叫做文档数据库【官网是这样说】)。 作为一种 NoSQL 数据库产品,MongoDB 使用类 JSON文档和可选模式。 它支持分片、复制和 ACID 事务(从 4.0 版开始)等功能。 MongoDB Atlas 是其托管云服务,在AWS、Google Cloud Platform 和 Microsoft Azure 上运行。
当前版本采用服务器端公共许可证(SSPL)授权。 MongoDB 是 MACH 联盟的成员。
-
MongoDB社区版是免费的,支持Windows、Linux和macOS三种操作系统。许多Linux包管理系统曾经包含MongoDB的包。2018年因许可证变更,MongoDB不再属于开源软件,Debian、Fedora和Red Hat Enterprise Linux等Linux发行版已从软件存储库中移除了MongoDB。
-
MongoDB使用内存映射文件,32位系统上限制大小为2GB的资料,64位支持更大的资料。MongoDB的核心构件只能在小端序系统上运行,客户端库可以在小端序和大端序的系统上运行。
-
MongoDB自身的设计可以支持大量的瞬间读写能力,所以多用来做缓存,日志等
2、官方版本
- MongoDB Community Server 社区版 【适用于 Windows、Linux 和 macOS】
- MongoDB Enterprise Server 商业版本 【适用于 Windows、Linux 和 macOS】
- MongoDB Atlas 云服务版【Atlas 可在 AWS、Microsoft Azure 和 Google Cloud Platform 等云服务上运行,本文主要内容和Atlas我关】
3、简要历史
- 美国软件公司 10gen 于 2007 年开始开发 MongoDB,作为其计划中的平台即服务 (PaaS)产品的组成部分。
- 2009 年,该公司转向开源开发模式,并开始提供商业支持和其他服务。
- 2013 年,10gen 更名为 MongoDB Inc.
- 2018年因许可证变更(SSPL),MongoDB不再属于开源软件
- 2019年10月30日,MongoDB与阿里云达成合作,为阿里云客户提供MongoDB即服务解决方案。客户可以使用阿里巴巴全球数据中心的托管服务。
SSPL 不被开放源代码促进会(OSI)、Red Hat 或Debian 认为是开源软件,因为上述规定对特定使用领域存在歧视。对其堆栈中使用专有软件的软件用户具有歧视性,因为该许可证要求将与服务交互的每个部分开源,而在这些情况下这是不可能的。这违反了开放源代码促进会使用的开放源代码 定义中的标准61和 92 。
2022 年 3 月 10 日,MongoDB 警告其在俄罗斯和白俄罗斯的用户,由于美国因俄乌战争而实施的制裁,他们在 MongoDB
Atlas 平台上存储的数据将被销毁。
4、主要特点
-
Ad-hoc queries 临时查询
MongoDB 支持字段查询、范围查询和正则表达式搜索。 -
Indexing 索引
可以使用主索引和二级索引进行索引。 -
Replication 主副本复制
MongoDB可以创建单个副本或多个,默认情况下读写操作都在主题中进行,副本会全量复制主题中的操作,当主体发生故障时,副本集会自动执行选举过程,选择其中一个辅助副本成为新的主体。辅助副本可以选择提供读取操作,但默认情况下,该数据仅具有最终一致性。如果复制的 MongoDB 部署只有一个辅助成员,则必须在该集合中添加一个称为仲裁器的单独守护进程。 因此,理想的分布式 MongoDB 部署至少需要三个独立的服务器,即使只有一个主服务器和一个辅助服务器。 -
Load balancing 负载均衡
MongoDB 使用分片技术实现水平扩展。 用户选择一个分片键,它决定了集合中数据的分布方式。数据被拆分成不同的范围(基于分片键),并分布到多个分片上,这些分片是主分片,并包含一个或多个副本。或者,也可以将分片键进行哈希运算,映射到具体的分片上,从而实现数据均匀分布。 -
File storage 文件存储
MongoDB 可以用作文件系统,称为GridFS,具有在多台机器上存储文件的负载平衡和数据复制功能。(GridFS不支持事务) -
Aggregation 聚合
支持 聚合管道、map-reduce 函数和单一用途聚合方法。 -
Server-side JavaScript execution JSON执行命令
-
Capped collections 上限集合
MongoDB 支持固定大小的集合,称为上限集合。此类集合会保持插入顺序,并且一旦达到指定大小,其行为将类似于循环队列。 -
Transactions 事务
AICD事务
5、支持语言
MongoDB有官方的驱动如下:
- C
- C++
- C#
- Erlang
- Haskell
- Java
- JavaScript
- Lisp
- fibjs
- node.JS
- Perl
- PHP
- Python
- Ruby
- Scala
- Go
- Rust
二、怎么使用
安装方式不在赘述
1、连接MongoDB
MongoDB Shell (mongosh) 是一个 JavaScript 和 Node.js REPL 环境,
用于与Atlas 本地或其他远程主机上的 MongoDB 部署进行交互。使用 MongoDB Shell 测试查询,并与 MongoDB
数据库中的数据进行交互。
^^^^^^这是官网的文档中推荐的一个连接 MongoDB的工具,实际操作中有很多方式,
例如直接使用DataGrip或者MongoDB compassd等
admin,config,local是MongoDB的三个默认数据库
spring连接
spring:data:mongodb:uri: mongodb://root:密码@127.0.0.1:27017/数据库?authSource=admin
默认没密码可以直接 mongodb://127.0.0.1:27017
root用户是admin下的用户,使用他连接其他数据库需要指明当前用户所属数据库 authSource=admin
2、基础命令使用
1. 创建数据库
(mg中并没有明确的创建语句,通过use切换数据库可以切换到没有创建的数据库中,从而实现创建数据库的操作)
use databaseName;
2. 创建集合
db.createCollection()
3、新增一个数据
db.集合名称.insertOne({内容})
3、查看当前集合占用内存
db.集合名称.storageSize()
4、到期时间14天
必须要有时间字段
db.集合.createIndex({ timestamp: 1 },{ expireAfterSeconds: 1209600 } // 14天 = 14 * 24 * 3600 秒
)
3、java基础使用案例
1、连接测试
public static void main(String[] args) {String uri = "mongodb://127.0.0.1:27017";try (MongoClient client = MongoClients.create(uri)) {MongoDatabase db = client.getDatabase("admin");// 执行一个简单操作:列出所有数据库名称List<String> databaseNames = client.listDatabaseNames().into(new ArrayList<>());System.out.println("✅ 成功连接 MongoDB!");System.out.println("可用数据库: " + databaseNames);MongoCollection<Document> httpAccessLogs = db.getCollection("test2");// 可选:尝试创建集合或插入数据db.createCollection("test_log");System.out.println("📌 已创建 test_log 集合");} catch (Exception e) {System.err.println("❌ 连接失败: " + e.getMessage());e.printStackTrace();}}
2、新增日志测试
先创建实体
@Data
@Document(collection = "集合名称")
public class HttpAccessLogVo {@Idprivate String id;private String path; private int status; private String requestBody;private String responseBody;@Indexed(name = "timestamp_index", expireAfter = "14d")//到期时间14天private LocalDateTime timestamp; }
Spring中有管理好的MongoTemplate
HttpAccessLogVo httpLog = new HttpAccessLogVo();mongoTemplate.insert(httpLog);
3、查询测试
Query query = new Query();query.addCriteria(Criteria.where("path").is( logDTO.getPath()));query.addCriteria(Criteria.where("status").is( logDTO.getStatus()));query.addCriteria(Criteria.where("timestamp").gte(localDateTime1).lte(localDateTime2));TerminatingFind<HttpAccessLogVo> matching = mongoTemplate.query(HttpAccessLogVo.class).matching(query);List<HttpAccessLogVo> list = matching.all();
参考文章
个人笔记,不同意见,望有交流
直接可以点击跳转连接
官网https://www.mongodb.com/
https://en.wikipedia.org/wiki/MongoDB
参考
不歧视领域 许可证不能限制任何人将程序用在某个特定的领域。例如,不能要求人们不可以把程序用在商业领域或者基因研究。 ↩︎
许可证不能限制其他软件 许可证不得对与许可软件一起分发的其他软件施加限制。例如,许可证不得坚持在同一介质上分发的所有其他程序必须是开源软件。 ↩︎