在使用
mongo
的时候遇到如下问题:
org.bson.BsonSerializationException: Payload document size of is larger than maximum of 16777216.
这个问题经过分析以及查阅资料,发现是由于单个文档的大小超过了16MB的限制所导致的,对遇到过这个问题的人来说,这个16MB很好理解, 而对于还未意识到这个问题的人来说,这个’坑’ 可能会让你花时间都难以发现,因为这又要牵扯到mongodb的另一个存储机制 ---- 无返回码,什么意思呢? 就是mongodb的插入,删除等操作, 客户端向数据库发出请求之后,是不需要等待数据库返回操作是否成功的返回结果。这也是mongodb插入,更新等操作速度快的原因。
当单个文件超过16MB之后, 程序并不会报错, 但此时, 数据已经无法插入数据库了。
-
更改数据表结构,避免单个文档超过16M,将数据分开存储,反正mongodb也比较适合用冗余换取效率。不妨在同一个集合中多建立几个文档,分开存储信息。
-
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),但是它是存储在MonoDB的集合中。
GridFS 会将文件对象分割成多个的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename、content_type、还有用户自定义的属性)将会被存在files集合中。
以下是简单的 fs.chunks 集合文档:
{
"_id" : ObjectId("62e8de5eb586acc149a7b012"),
"files_id" : ObjectId("62e8de5eb586acc149a7b012"),
"n" : 0,
"data" : "Binary Data"
import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
* @Description : GridFS文件基本操作
@RestController
@RequestMapping("/gridfs")
public class GridFSController {
@Autowired
private GridFsTemplate gridFsTemplate;
* 上传文件
* @param multipartFile 文件
* @return 上传成功文件id
@PostMapping("/upload")
public String uploadFile(@RequestParam(value = "file") MultipartFile multipartFile) {
Map<String, String> metaData = new HashMap<>();
metaData.put("tags", "test");
try (
InputStream inputStream = multipartFile.getInputStream();
String fileName = multipartFile.getOriginalFilename();
ObjectId objectId = gridFsTemplate.store(inputStream, fileName, metaData);
return objectId.toHexString();
} catch (IOException e) {
e.printStackTrace();
return null;
* 获取文件信息
* @param fileId 文件id
@GetMapping("/get/{fileId}")
public void getFile(@PathVariable("fileId") String fileId) {
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
if (gridFSFile == null) {
throw new RuntimeException("No file with id: " + fileId);
GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
try {
String content = IOUtils.toString(resource.getInputStream(), "UTF-8");
byte[] bytes = IOUtils.toByteArray(resource.getInputStream());
} catch (IOException e) {
e.printStackTrace();
* 删除文件
* @param fileId 文件id
@DeleteMapping("/delete")
public void deleteFile(@RequestParam(value = "fileId") String fileId) {
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));
命令格式:db.collectionName.find().sort({key:参数})
参数说明:
-1:表示降序
1:表示升序(默认)
db.raw_issue_cache.find().sort({num:-1}).limit(1);
Lists.partition(list, groupSize)拆分后,还是按照原来的顺序,最后一子列表数量可能不足。
List<List<Map>> splitList(List<Map> list , int groupSize){
return Lists.partition(list, groupSize);
Returns consecutive sublists of a list, each of the same size (the final list may be smaller). For example, partitioning a list containing [a, b, c, d, e] with a partition size of 3 yields [[a, b, c], [d, e]] -- an outer list containing two inner lists of three and two elements, all in the original order.
对于一个列表,我们希望求这个列表对象的某属性的和,可以使用map()+reduce(),先通过map()来将需要求和的数据给汇总,随后用reduce()进行求和操作:
BigDecimal result1 = userList.stream()
.map(Opportunity::getAmount)
.reduce(BigDecimal.ZERO,BigDecimal::add);
int result2 = userList.stream()
.map(Opportunity::getAmount)
.reduce(Integer::sum).orElse(0);
sudo netstat -lantp | grep -i 9000
linux 查看并对外开放端口(防火墙拦截处理)
查看端口是否可访问:telnet ip 端口号 (如本机的35465:telnet localhost 35465)
开放的端口位于/etc/sysconfig/iptables中
查看时通过 more /etc/sysconfig/iptables 命令查看
如果想开放端口(如:8889)
(1)通过vi /etc/sysconfig/iptables 进入编辑增添一条-A INPUT -p tcp -m tcp --dport 8889 -j ACCEPT 即可
(2)执行 /etc/init.d/iptables restart 命令将iptables服务重启
#(3)保存 /etc/rc.d/init.d/iptables save
注:如若不想修改iptables表,可以直接输入下面命令:
#iptables -I INPUT -p tcp --dport 8889 -j ACCEPT
经过使用上面的查看端口占用情况,发现9000端口被占用,但是不好修改,所以可以修改sonarqube以及sonar-scanner的配置来修改端口。
sonarqube-7.9.1/conf/sonar.properties:
sonar.web.port=9010
sonar-scanner-4.0.0.1744-linux/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9010
问题描述:
发生异常: WriteError
Resulting document after update is larger than 16777216, full error: {‘index’: 0, ‘code’: 17419, ‘errmsg’: ‘Resulting document after update is larger than 16777216’}
解决方案:
第一步:引入依赖
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
Payload content length greater than maximum allowed 1048576
在kibana7.4.2的console中,利用Bulk进行批量操作GIS数据,文件大小为1.84Mb,全都是index操作。总共16条记录。
问题分析:取其中的内容最长的一条记录进行测试,能够正常插入。取其中的13条记录进行操作,提示一样的...
文章目录Java 读取任意shapefile的所有字段,并插入到MongoDB数据库(Spring Boot)1. 统一返回结果封装2. shp文件数据实体封装3. 核心代码3. 可能出现的异常3.1 异常产生原因3.2 解决方案4 扩展4.1 创建数据库分片
Java 读取任意shapefile的所有字段,并插入到MongoDB数据库(Spring Boot)
亮点:动态获取字段信息,动态创...
org.bson.BsonSerializationException: Maximum serialization depth exceeded (does the object being serialized have a circular reference?).
at org.bson.AbstractBsonWriter.writeStartDocument(AbstractBso...