Как выполнить операции обновления в 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 вы не удаляете / удаляете один документ, а фактически пачку документов (файлы разбиваются на куски, и каждый кусочек является отдельным документом). Это означает, что замена файла просто невозможна атомарным способом.

Вместо этого вы можете:

  1. вставить новый файл с новым именем
  2. после того, как это произошло (используйте подтвержденную репликой озабоченность записи), обновите все ссылки на старый файл, чтобы указать на новый
  3. после того как вы получили подтверждение, вы можете удалить старый файл

GridFS - это хакерская функция. Часто лучше просто использовать отдельный файловый сервер с реальной файловой системой для хранения содержимого файла и хранить только метаданные в MongoDB.

Другие вопросы по тегам