Монго документ и файл gridfs отношения
В настоящее время существует требование наличия объекта - "application", в котором есть поле: "name", "uploadTime" и "executeFile".
В настоящее время база данных mongodb. Я хочу использовать документ
Class Application {
String id;
String name;
String type;
Date uploadTime;
GridFSDBFile executeFile;
}
Слой Dao, когда я пишу сохранить, я обнаружил, что не могу связать 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 необходимо выполнить в транзакции. Я помню, что Монго не поддерживает транзакции. Как это сделать? Только проверить транзакцию в коде Java?
1 ответ
Я не могу связать GridFSDBfile с документами напрямую. Мне нужно сначала использовать GridFsTemplate.store сохранить GridDBFile, затем использовать GridFsTemplate.findOne найти его по имени и поместить объект, вложенный в документ приложения. Затем с помощью MongoOperation сохраните документ приложения.
Вы ошиблись здесь. Когда вы сохраняете файл в 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
поле. Имеет то же самое ObjectId
как указано в записи в fs.files
коллекция.
Вот как MongoDB
поддерживает связь между содержимым файла и его метаданными. GridFS
это простой API для отвлечения пользователя от реализации низкоуровневой реализации.
Если нет, то я думаю, что вызовы GridFsTemplate.store и MongoOperation.save необходимо выполнить в транзакции. Я помню, что Монго не поддерживает транзакции. Как это сделать? Только проверить транзакцию в коде Java?
Нет необходимости для приложения создавать или поддерживать какие-либо транзакции для этой операции.