MongoDB安装(Ubuntu)apt模式安装
sudo apt-get install gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg
--dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
mongod -version
# 开启mongd
sudo systemctl start mongod
# 查看mongodb状态 active表示正在运行
sudo systemctl status mongod
# 设置mongodb可以开机自启动
sudo systemctl enable mongod
停止
sudo systemctl stop mongod
重启
sudo systemctl restart mongod
为了让外网可以访问到MongoDB,需要修改对应的配置文件
sudo vim /etc/mongod.conf
# 把bindIP的值修改为0.0.0.0
需要注意的是,这样子的设置会导致非常不安全,如果只是为了学习当然无所谓,不过一般还是建议设置一下密码,(这一步可选)
先在配置文件启动鉴权模式
然后使用mongosh进入命令行模式
然后给对应的数据库创建用户(我这里统一用户名就是root,密码就是sql2008)
use test
db.createUser({user:"root",pwd:"sql2008",roles:[{role:"readWrite",db:"test"}]})
基本操作方法
在进行实际操作之前,我们需要先了解一下MongoDB的基础数据模型是怎么样的
最基础的部分主要包括:
- 数据库 database或者db
- 集合collection(也可以叫做表)
- 集合的一条记录 document
- 记录当中的字段 field
可以简单的理解为一个JSON数组,MongoDB存储主要是采用了Bson(Binary JSON)的形式存储
命令行模式
切换到数据库,如果没有则会新建
use test
需要注意的是,如果开启了权限校验,就需要先登录(如果没有开启则可以跳过这一步)
db.auth("root","sql2008")
默认情况下数据库当中没有任何集合,我们新建一个集合
show collections
db.createCollection("teacher")
然后在对这个集合插入一条数据或多条
db.teacher.insertOne({"name":"sakura"})
db.teacher.insertMany([{"name":"sakura"},{"name":"test"}])
查看集合数据
db.teacher.find()
需要注意的是MongoDB里面也有主键的概念,就是它默认会给你添加一个"_id"字段,然后生成一个唯一标识符,但是如果在插入时手动的指定了"__id"的值,就必须保证这个值是唯一的不然插入就会失败
更新数据,MongoDB的更新操作可以支持多种形式的更新,比如只更新第一条匹配到的记录,或者更新所有匹配到的记录、如果不存在就当新记录插入集合等,具体实现可以通过参数实现
db.teacher.updateOne({"name":"sakura0"},{$set:{"age":10}})
删除 deleteOne、deleteMany(与插入类似)
db.teacher.deleteOne({"name":"sakura"})
还有就是删除整个集合
dp.teacher.drop()
删除整个数据库
db.dropDatabase()
需要注意的是,这里的drop删除,更加准确的理解应该是清除,它只是把记录和数据全都删除了,但是删除对象的本身还是存在的,比如drop删除整个集合,集合里面一条记录都没有了,但这个集合本身还是存在的。
编程模式,以Java为例
开发工具:idea(推荐)
如果不会有idea的话,建议看一下下面这篇文章,快速入门
https://zhuanlan.zhihu.com/p/469563500
首先需要强调的是,MongoDB一定要先保证外网可以访问
为了让外网可以访问到MongoDB,需要修改对应的配置文件
sudo vim /etc/mongod.conf
# 把bindIP的值修改为0.0.0.0
然后就是新建一个maven项目,导入对应的依赖,
tips:一般maven依赖都可以去中央仓库搜索:https://mvnrepository.com/
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.10</version>
</dependency>
这种类型的第三方依赖一般都是会提供给你一个客户端对象,让你可以去操作MongoDB
所以我们要做的就是把配置换成自己的,初始化一个自己的客户端对象,然后进行后续操作
第一步:
初始化客户端对象,这里我写了一个工具类用于统一的管理
为了方便管理对应的数据库配置(比如数据库的IP地址、用户名和密码,要访问的数据库),我这里将其统一写到了配置文件当中,具体做法就是在src/main路径下新建一个resources资源目录,然后新建一个配置文件mongofb.properties
host=192.168.10.129
port=27017
dbname=test
password=sql2008
username=root
然后读取该配置文件初始化对应的客户端对象
public class MongoUtils {
private static Properties properties;
private static MongoDatabase mongoDatabase;
private static InputStream stream;
private static String host;
private static int port;
private static String dbname;
private static String password;
private static String username;
//创建一个静态代码块,用于初始化工具类的静态变量,该静态代码块在类加载过程中的初始化阶段执行,并且只执行一次
static {
//判断properties集合对象是否为空,为空则创建一个集合对象
if (properties == null) {
properties = new Properties();
}
/*
* 由于我们会调用load方法,而load方法低层抛出了一个IOException异常,此异常为编译时期异常所以,
* 我们调用load方法时,需要处理低层抛过来的异常*/
try {
//创建一个InputStream字节输入流对象,用于接收mongodb.properties配置文件中的配置参数
stream = MongoUtils.class.getClassLoader().getResourceAsStream("mongodb.properties");
//properties集合对象调用load()方法,将配置参数加载到properties集合中
properties.load(stream);
} catch (IOException e) {
throw new RuntimeException(e);
}
//根据mongodb.properties配置文件中的key,获取value值
host = properties.getProperty("host");
port = Integer.parseInt(properties.getProperty("port"));
dbname = properties.getProperty("dbname");
password = properties.getProperty("password");
username = properties.getProperty("username");
}
//定义一个getMongoClient()方法,用于获取MOngoDB数据库的连接对象
public static MongoClient getMongoClient() {
String addr = "mongodb://" + username + ":" + password + "@" + host + ":" + port;
MongoClient mongoClient = MongoClients.create(addr);
return mongoClient;
}
public static MongoDatabase getMongoDao() {
String addr = "mongodb://" + username + ":" + password + "@" + host + ":" + port;
MongoClient mongoClient = MongoClients.create(addr);
return mongoClient.getDatabase(dbname);
}
}
然后就是针对基础的API进行使用,在下面我只列出了最基础的实现,增删改查的基础实现,如果有更精细化的要求,建议阅读官方文档:
https://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/
public class TestMongoDB {
private static MongoDatabase mongoDao;
private static MongoClient mongoClient;
@Before
public void init() {
mongoDao = MongoUtils.getMongoDao();
mongoClient = MongoUtils.getMongoClient();
}
/**
* 查看数据库
*/
@Test
public void showDBs() {
MongoIterable<String> strings = mongoClient.listDatabaseNames();
for (String string : strings) {
System.out.println(string);
}
}
/**
* 查看所有集合
*/
@Test
public void listCollections() {
ListCollectionsIterable<Document> documents = mongoDao.listCollections();
for (Document document : documents) {
System.out.println(document);
}
}
/**
* 创建集合
*/
@Test
public void createCollection() {
mongoDao.createCollection("test_collection");
}
/**
* 插入数据到集合
*/
@Test
public void insertOne() {
MongoCollection<Document> test = mongoDao.getCollection("test");
Document one = new Document();
one.put("name", "sakura");
one.put("age", 18);
test.insertOne(one);
}
/**
* 删除
*/
@Test
public void deleteOne() {
MongoCollection<Document> test = mongoDao.getCollection("test");
test.deleteOne(Filters.eq("name", "sakura"));
// 删除所有符合匹配条件的数据
// test.deleteMany(Filters.eq("name", "sakura"));
}
/**
* 修改记录document
*/
@Test
public void update() {
MongoCollection<Document> test = mongoDao.getCollection("test");
test.updateOne(Filters.eq("name", "sakura")
, new Document("$set", new Document("age", 20)));
}
@Test
public void listDocument() {
MongoCollection<Document> test = mongoDao.getCollection("test");
FindIterable<Document> documents = test.find();
for (Document document : documents) {
System.out.println(document);
}
}
}