gpt4 book ai didi

mongodb - mongo文件和gridfs文件关系

转载 作者:可可西里 更新时间:2023-11-01 09:44:11 26 4
gpt4 key购买 nike

目前要求有一个对象 - “application”,它具有以下字段:“name”、“uploadTime”和“executeFile”。

目前数据库是mongodb。我要使用文档

Class Application {
String id;
String name;
String type;
Date uploadTime;
GridFSDBFile executeFile;
}

Dao层,写save的时候发现不能直接关联GridFSDBfile到document。我需要先使用 GridFsTemplate.store 保存 GridDBFile,然后使用 GridFsTemplate.findOne 按名称找到它,并将对象嵌套在应用程序文档中。然后使用MongoOperation保存应用文档。

try {
inputStream = new FileInputStream("C:/testing.app");
gridFsOperations.store(inputStream, "test.app", "jar");

} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Query query = query(where("filename").is("test.app"));
GridFSDBFile gridFsDBFile = gridFsOperations.findOne(query);

Application application = new Application ();
application.setName( "test-app");
application.setType( "type", "Java");
application.setexecuteFile (gridFsDBFile);

applicationDao.save(application);

有没有办法只调用 MongoOperation?如果没有,我认为调用 GridFsTemplate.store 和 MongoOperation.save 需要在事务中执行。我记得Mongo不支持事务。这该怎么做?只检查Java代码中的事务?

最佳答案

I find I can not related GridFSDBfile to document directly. I need first use GridFsTemplate.store save GridDBFile, then use GridFsTemplate.findOne find it by name, and put the object nested in application document. Then use MongoOperation save the application document.

这里你搞错了。当您在 GridFS 中保存文件时,文件的存储及其元数据分布在两个集合中,即 fs.filesfs.chunks。每当使用 GridFs API 插入文件时,文件及其元数据都会一次性存储。

为了更好的画质,

当下面的指令被执行时:

    gridFsOperations.store(inputStream, "test.app", "jar");

MongoDB 创建两个条目,一个进入 fs.files,另一个进入 fs.chunks 集合。

fs.files 集合中有一个条目:

{
"_id" : ObjectId("545d6699756c779b8cb8b13d"),
"type":"jar",
"filename" : "test.app",
"aliases" : null,
"chunkSize" : NumberLong(262144),
"uploadDate" : ISODate("2014-11-08T00:40:57.298Z"),
"length" : NumberLong(433),
"contentType" : null,
"md5" : "5e49ad0614687c7ad343f6f9fe6843b2"
}

该条目只有文件的元数据信息,例如文件名和类型。您甚至可以使用 BasicDBObject 类设置其他元数据信息。你想包括 uploadTime,

DBObject metadata = new BasicDBObject();
metadata.put("uploadTime", Calendar.getInstance().getTime());

保存如下,

gridFsOperations.store(inputStream, "test.app", "jar",metadata );

它还有一条重要信息,即在其 _id 字段中对包含实际文件内容的文档的引用。

fs.chunks 集合中的另一个条目:

{
"_id" : ObjectId("545d6699756c779b8cb8b13e"),
"files_id" : ObjectId("545d6699756c779b8cb8b13d"),
"n" : 0,
"data" : BinData(0,"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4N
Cjx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5z
Zm9ybSINCnZlcnNpb249IjEuMCI+DQoNCjx4c2w6b3V0cHV0IGVuY29kaW5nPSJVVEYtOCIgbWV0aG9k
PSJ4bWwiIGluZGVudD0ieWVzIi8+DQo8eHNsOnZhcmlhYmxlIG5hbWU9InRvcExldmVsIj4NCiAgICAg
ICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbm5lciIgc2VsZWN0PSInSGknIiAvPg0KICAgICAgICA8eHNs
OnZhbHVlLW9mIHNlbGVjdD0iJGlubmVyIi8+DQo8L3hzbDp2YXJpYWJsZT4NCiAgICANCjx4c2w6dGVt
cGxhdGUgbWF0Y2g9Ii8iID4NCiAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvcExldmVsIiAvPg0K
PC94c2w6dGVtcGxhdGU+DQo8L3hzbDpzdHlsZXNoZWV0Pg==")
}

这是实际的文档,其中包含 Binary 形式的文件内容。记下文档的 files_id 字段。它具有与 fs.files 集合中的条目引用的相同的 ObjectId

这就是 MongoDB 维护文件内容及其元数据之间关系的方式。 GridFS 只是一个 API,用于抽象用户处理低级实现。

f not, I think call GridFsTemplate.store and MongoOperation.save need executed in a transaction. I remember that Mongo doens't support transaction. How to do this? Only check the transaction in Java code?

应用程序无需为此操作创建或维护任何事务。

关于mongodb - mongo文件和gridfs文件关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com