MongoDB

菜鸟教程:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

概念

MongoDB_第1张图片
MongoDB_第2张图片

下载

windows版和linux版,参见菜鸟教程

启动

只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可
MongoDB_第3张图片

连接

MongoDB_第4张图片

创建和使用

在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

创建数据库:https://www.runoob.com/mongodb/mongodb-create-database.html
数据库:use DBName;没有该数据库时创建,有就自动使用;
集合:可以不创建,当你插入一些文档时,MongoDB 会自动创建集合。
MongoDB_第5张图片
MongoDB_第6张图片
MongoDB_第7张图片
MongoDB_第8张图片
MongoDB_第9张图片

存储文件

文件<16MB:可以直接将文件转换为二进制数据,以文档形式存入集合。
文件>16MB:要用到MongoDB GridFS。

Java API:代码示例,参见Springboot整合MongoDB https://www.cnblogs.com/three-fighter/p/12641771.html

GridFS示例:
MongoDB_第10张图片
MongoDB_第11张图片

GridFS存储原理

GridFS使用两个集合(collection)存储文件。一个集合是chunks, 用于存储文件内容的二进制数据;一个集合是files,用于存储文件的元数据。

当把一个文件存储到GridFS时,如果文件大于chunksize (每个chunk块大小为256KB),会先将文件按照chunk的大小分割成多个chunk块,最终将chunk块的信息存储在fs.chunks集合的多个文档中。然后将文件信息存储在fs.files集合的唯一一份文档中。其中fs.chunks集合中多个文档中的file_id字段对应fs.files集中文档”_id”字段。

读文件时,先根据查询条件在files集合中找到对应的文档,同时得到“_id”字段,再根据“_id”在chunks集合中查询所有“files_id”等于“_id”的文档。最后根据“n”字段顺序读取chunk的“data”字段数据,还原文件。

MongoDB_第12张图片

小文件下载

重点:在文档中的二进制数据是 org.bson.types.Binary类型,不能强转成Byte,使用Binary bin = document.get(“data”, org.bson.types.Binary.class)转为Binary,再getData()即可得到Byte数组。

package cn.com.infosec.netseal.common.util;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.Binary;

/**
 * @author Administator
 * @date 2021-08-25 17:46
 * @Description
 */
public class MongoUtil {
	public static void main(String[] args) throws Exception {
		MongoClient mongoClient = new MongoClient("10.20.61.94", 27017);
		// 连接到数据库
		MongoDatabase db = mongoClient.getDatabase("demo");
		System.out.println("Connect to database successfully");

		FindIterable<Document> findIterable = db.getCollection("test").find();
		MongoCursor<Document> mongoCursor = findIterable.iterator();
		while (mongoCursor.hasNext()) {
			Document document = mongoCursor.next();
			System.out.println("id----" + document.get("_id"));
			Binary bin = document.get("data", org.bson.types.Binary.class);
			FileUtil.saveFile("F:/1.pdf", bin.getData());
		}
	}


}

创建连接和获取指定数据库,可以封装起来,单例模式获取。

Java连接MongoDB

连接MongoDB需要有驱动包,查看maven仓库发现,3.8.2版本使用者较多,故使用该版本驱动。

 
 <dependency>
     <groupId>org.mongodbgroupId>
     <artifactId>mongo-java-driverartifactId>
     <version>3.8.2version>
 dependency>

连接方式:直连和池连

直连

直连的意思是,直接连接数据库,不使用缓冲池。

package cn.com.infosec.netseal.common.util;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

/**
 * @author Administator
 * @date 2021-08-25 17:46
 * @Description
 */
public class MongoUtil {
	private static MongoClient client = null;
	private static MongoDatabase db = null;
	static {
		if(client == null){
			// client = new MongoClient("10.20.61.94", 27017);
			// mongodb://username:[email protected]:27017/oppodb
			MongoClientURI uri = new MongoClientURI("mongodb://10.20.61.94:27017/demo");
			client = new MongoClient(uri);
			db = client.getDatabase(uri.getDatabase());
		}
	}

	public static void main(String[] args) throws Exception {
		// 查询test集合
		FindIterable<Document> findIterable = db.getCollection("test").find();
		MongoCursor<Document> mongoCursor = findIterable.iterator();
		while (mongoCursor.hasNext()) {
			Document document = mongoCursor.next();
			System.out.println("id----" + document.get("_id"));
		}
	}
}

常见问题

与springboot项目整合

springboot自动配置支持mongodb,如果我们再pom里依赖了MongoDB的jar,boot项目启动时就会去找MongoDB的连接配置。
如果我们没有配置的话,就会报错,报错如下。
常见出现场景:数据库连接配置在外部文件。

com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongodb-driver-core-3.4.2.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongodb-driver-core-3.4.2.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) ~[mongodb-driver-core-3.4.2.jar:na]
at java.lang.Thread.run(Unknown Source) [na:1.8.0_91]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_91]
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[na:1.8.0_91]
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[na:1.8.0_91]
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[na:1.8.0_91]
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[na:1.8.0_91]
at java.net.PlainSocketImpl.connect(Unknown Source) ~[na:1.8.0_91]
at java.net.SocksSocketImpl.connect(Unknown Source) ~[na:1.8.0_91]
at java.net.Socket.connect(Unknown Source) ~[na:1.8.0_91]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[mongodb-driver-core-3.4.2.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongodb-driver-core-3.4.2.jar:na]
... 3 common frames omitted 

解决方案:在@SpringBootApplication注解上,排除MongoDB的自动依赖。

@SpringBootApplication(exclude = { MongoAutoConfiguration.class })

其他常见关系型数据库的连接,解决方案同理,所以最常见的就是@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

你可能感兴趣的:(数据库,SpringBoot,SpringCloud,mongodb,数据库,spring,boot)