目前有一个对象 - "应用程序",它有文件:"name","uploadTime"和"executeFile"。
目前数据库是mongodb。我想使用文档
Class Application {
String id;
String name;
String type;
Date uploadTime;
GridFSDBFile executeFile;
}
道层,当我写保存时,我发现我不能直接将 GridFSDBfile 关联到文档。我需要首先使用 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 代码中的事务?
我发现我无法将 GridFSDBfile 直接关联到文档。我需要先使用 GridFsTemplate.store 保存 GridDBFile,然后使用 GridFsTemplate.findOne 按名称查找它,并将对象嵌套在 申请文件。然后使用Mongo操作保存应用程序 公文。
你在这里弄错了。当您将文件保存在 GridFS
中时,文件的存储及其元数据分布在两个集合中,即 fs.files
和 fs.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不是,我认为调用 GridFsTemplate.store 和MongoOperation.save需要在事务中执行。我记得蒙戈不支持 交易。怎么做?只检查 Java 代码中的事务?
应用程序无需为此操作创建或维护任何事务。