pom
<!-- mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.yaml
注意: uri中的username和password需要进行URI编码,再填进去(避免出现@等非法字符)
spring:
data:
mongodb:
uri: mongodb://username:password@ip:27017
database: llm-mp
基本使用
@Autowired
private MongoTemplate mongoTemplate;
检索数据
// 查询name=zs
Query query = Query.query(Criteria.where("name").is("zs"));
mongoTemplate.find(query,User.class);
mongoTemplate.find(query,User.class,"mongodb_user");
// 查询所有
mongoTemplate.findAll(User.class);
mongoTemplate.findAll(User.class,"mongodb_user");
// 分页查询 page页码,pageSize每页展示几个
Pageable pageable = PageRequest.of(page - 1, pageSize, Sort.by(Sort.Order.desc("date")));
Query query = new Query().with(pageable);
return this.mongoTemplate.find(query, User.class,"mongodb_user");
// 查询多个
Query query= Query.query(Criteria.where("id").in("id1","id2","id3")).with(Sort.by(Sort.Order.desc("date")));
List<Publish> list= this.mongoTemplate.find(query, User.class);
// 查询数量
Criteria criteria = Criteria.where("userId").is("12345")
.and("name").is(new ObjectId("张三"))
.and("address").is("上海");
Query query = Query.query(criteria);
long count = this.mongoTemplate.count(query, User.class);
插入数据
List<User> list = new ArrayList<>();
User user= new User();//
user.setName("admin");
user.setAddress("测试");
list.add(user);
// 保存对象到mongodb
mongoTemplate.save(user);
mongoTemplate.insert(user);
// 根据集合名称保存对象到mongodb
mongoTemplate.save(user,"mongodb_user");
mongoTemplate.insert(user,"mongodb_user");
// 根据集合名称保存list到mongodb
mongoTemplate.save(list,"mongodb_user");
mongoTemplate.insert(list,"mongodb_user");
mongoTemplate.insert(list,User.class);
更新数据
User user = new User();
user.setId("5d1312aeb1829c279c6c256b");
user.setName("admin");
user.setAddress("测试");
Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","zs");
// 更新一条数据
mongoTemplate.updateFirst(query,update, User.class);
mongoTemplate.updateFirst(query,update, "mongodb_user");
mongoTemplate.updateFirst(query,update, User.class,"mongodb_user");
// 更新多条数据
mongoTemplate.updateMulti(query,update, User.class);
mongoTemplate.updateMulti(query,update,"mongodb_user");
mongoTemplate.updateMulti(query,update, User.class,"mongodb_user");
// 更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, User.class);
mongoTemplate.upsert(query,update,"mongodb_user");
mongoTemplate.upsert(query,update, User.class,"mongodb_user");
删除数据
List<MongoDbJavaTest> list = new ArrayList<>();
User user= new User();
user.setId("5d1312aeb1829c279c6c256b");
list.add(user);
Query query = Query.query(Criteria.where("_id").in("5d1312aeb1829c279c6c256b","5d13133ab1829c29d02ce29c"));
// 根据条件删除
mongoTemplate.remove(query);
mongoTemplate.remove(user);
mongoTemplate.remove(User.class);
// 根据条件删除(可删除多条)
mongoTemplate.remove(query,User.class,"mongodb_user");
GridFS
GridFS简介
GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.
字面直译就是说GridFS是用来存储大于BSON文档限制的16MB的文件。
官方文档
存储原理: GridFS 会将大文件对象分割成多个小的chunk(文件片段), 一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
每一个数据库有一个GridFS区域,用来存储。
需要通过先创建bucket(和OSS中一样的概念)来存储,一个bucket创建后,一旦有文件存入,在collections中就会自动生成2个集合来存储文件的数据和信息,一般是bucket名字+files和bucket名字+chunks。
每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。
demo
package com.ruijie.cloud.llm.mp.model;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.model.GridFSUploadOptions;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.FileCopyUtils;
import java.io.*;
import java.util.List;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ModelApplication.class)
public class ModelApplicationTest {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoClient mongoClient;
// GridFS下的bucket,自行指定要把文件存储到哪个bucket。
private String BUCKET_NAME = "modules";
// 源文件,即要被存储的文件的绝对路径
private String FILE_PATH = "C:\\Users\\13110\\Desktop\\temp\\jdk-8u192-windows-x64.exe";
// 存储文件后自动生成的存储文件信息的collection,一般是xx.files。
private String COLLECTION_NAME = "modules.files";
// 用于演示接收输出文件的路径
private String FILE_OUTPUT_PATH = "C:\\Users\\13110\\Desktop\\jdk-8u192-windows-x64.exe";
@Test
public void testGridFSSaveFiles() {
// saveToGridFS();
System.out.println("------------");
readFromGridFS();
}
@Test
public void createDB(){
User user = new User("zz");
User user1 = new User("zz1");
MongoTemplate cm_test = new MongoTemplate(mongoClient, "cm_test");
cm_test.save(user,"mongodb_user");
cm_test.insert(user1,"mongodb_user");
Query query = Query.query(Criteria.where("name").is("zz"));
List<User> users = cm_test.find(query, User.class);
System.out.println(user);
}
/**
* 传入bucketName得到指定bucket操作对象。
*
* @param bucketName
* @return
*/
public GridFSBucket createGridFSBucket(String bucketName) {
MongoDatabase db = mongoTemplate.getDb();
return GridFSBuckets.create(db, bucketName);
}
/**
* 储存文件到GridFS
*/
public void saveToGridFS() {
// 先调用上面方法得到一个GridFSBucket的操作对象
GridFSBucket gridFSBucket = createGridFSBucket(BUCKET_NAME);
File file = new File(FILE_PATH);
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 设置GridFS存储配置,这里是设置了每个chunk(块)的大小为1024个字节,也可以设置大一点。 MetaData是对文件的说明,如果不需要可以不写。 也是以键值对存在,BSON格式。
GridFSUploadOptions options = new GridFSUploadOptions().chunkSizeBytes(1024).metadata(new Document("user", "onepiece"));
// 调用GridFSBucket中的uploadFromStream方法,把对应的文件流传递进去,然后就会以binary(二进制格式)存储到GridFS中,并得到一个文件在xx.files中的主键ID,后面可以用这个ID来查找关联的二进制文件数据。
ObjectId objectId = gridFSBucket.uploadFromStream(file.getName(), inputStream, options);
System.out.println(file.getName() + "已存入mongodb gridFS, 对应id是:" + objectId);
}
/**
* 从GridFS中读取文件
*/
public void readFromGridFS() {
// 这里查找条件我先不写,默认查所有,取第一条做验证演示。 用Document类接收。
List<Document> files = mongoTemplate.find(new Query(), Document.class, COLLECTION_NAME);
Document file = files.get(0);
// 得到主键ID,作为等下要查询的文件ID值。
ObjectId fileId = file.getObjectId("_id");
String filename = file.getString("filename");
// 先调用上面方法得到一个GridFSBucket的操作对象
GridFSBucket gridFSBucket = createGridFSBucket(BUCKET_NAME);
// 调用openDownloadStream方法得到文件IO流。
InputStream downloadStream = gridFSBucket.openDownloadStream(fileId);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(FILE_OUTPUT_PATH + filename);
// 把IO流直接到指定路径的输出流对象实现输出。
FileCopyUtils.copy(downloadStream, fileOutputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
评论区