如何在GridFS中执行更新操作(使用Java)?

5

我正在使用Mongo-Java-Driver 2.13,我在 GridFS 中存储了一个PDF文件(大小30mb)。我可以轻松地执行插入、删除和查找操作。

    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.filesbooks.chunks集合中。现在我想要进行更新

  • 情况1:PDF文件
  • 情况2:标题或作者

如何在GridFS中执行这些情况1的更新操作?

我知道我需要维护多个文件版本并选择正确的版本。有人能解释一下吗?

编辑

我可以轻松更新元数据(标题,作者)。

    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个回答

7
在GridFS中,你删除的不是单个文档,而是一堆文档(文件被分成块,每个块都是一个独立的文档)。这意味着以原子方式替换文件是不可能的。
相反,你可以:
  1. 插入一个新的带有新名称的文件
  2. 在此之后(使用“副本确认”写关注点),更新所有对旧文件的引用以指向新文件
  3. 在确认完成后,删除旧文件
GridFS是一种类似hack的特性。通常最好只在MongoDB中存储元数据,并使用具有真实文件系统的独立文件服务器来存储文件内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接