Как выполнить операции обновления в GridFS (используя Java)?
Я использую Mongo-Java-Driver 2.13
Я сохранил файл PDF (размер 30 МБ) в GridFS. Я могу легко выполнить вставку, удаление и найти операцию.
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("testDB");
File pdfFile = new File("/home/dev/abc.pdf");
GridFS gfs = new GridFS(db,"books");
GridFSInputFile inputFile = gfs.createFile(pdfFile);
inputFile.setId("101");
inputFile.put("title", "abc");
inputFile.put("author", "xyz");
inputFile.save();
данные сохраняются в books.files
а также books.chunks
коллекции. Теперь я хочу обновить:
- случай 1: файл PDF
- случай 2: название или автор
Как выполнить эти операции обновления для случая 1 в GridFS?
Я узнал, что мне нужно поддерживать несколько версий моих файлов и выбрать правильную версию. Кто-нибудь может прояснить это?
Редактировать:
Я могу легко обновлять метаданные (название, автор).
GridFSDBFile outputFile = gfs.findOne(new BasicDBObject("_id", 101));
BasicDBObject updatedMetadata = new BasicDBObject();
updatedMetadata.put("name", "PG");
updatedMetadata.put("age", 22);
outputFile.setMetaData(newMetadata);
outputFile.save();
1 ответ
В GridFS вы не удаляете / удаляете один документ, а фактически пачку документов (файлы разбиваются на куски, и каждый кусочек является отдельным документом). Это означает, что замена файла просто невозможна атомарным способом.
Вместо этого вы можете:
- вставить новый файл с новым именем
- после того, как это произошло (используйте подтвержденную репликой озабоченность записи), обновите все ссылки на старый файл, чтобы указать на новый
- после того как вы получили подтверждение, вы можете удалить старый файл
GridFS - это хакерская функция. Часто лучше просто использовать отдельный файловый сервер с реальной файловой системой для хранения содержимого файла и хранить только метаданные в MongoDB.