菜鸟教程:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html
windows版和linux版,参见菜鸟教程
只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可
在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
创建数据库:https://www.runoob.com/mongodb/mongodb-create-database.html
数据库:use DBName;没有该数据库时创建,有就自动使用;
集合:可以不创建,当你插入一些文档时,MongoDB 会自动创建集合。
文件<16MB:可以直接将文件转换为二进制数据,以文档形式存入集合。
文件>16MB:要用到MongoDB GridFS。
Java API:代码示例,参见Springboot整合MongoDB https://www.cnblogs.com/three-fighter/p/12641771.html
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”字段数据,还原文件。
重点:在文档中的二进制数据是 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());
}
}
}
创建连接和获取指定数据库,可以封装起来,单例模式获取。
连接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自动配置支持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 })