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

如何在GridFS中执行更新操作(使用Java)?,java,mongodb,gridfs,mongodb-java,Java,Mongodb,Gridfs,Mongodb Java,我正在使用mongojava驱动程序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,"boo

我正在使用
mongojava驱动程序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.files
books.chunks
集合中。现在我想更新:

  • 案例1:pdf文件
  • 案例2:标题或作者
如何在GridFS中对案例1执行这些更新操作

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

编辑

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


在GridFS中,您不是删除单个文档,而是删除一组文档(文件被分割成块,每个块都是一个单独的文档)。这意味着以原子方式替换文件是不可能的

你可以做的是:

  • 使用新名称插入新文件
  • 发生这种情况后(使用副本确认写入关注点),更新对旧文件的所有引用以指向新文件
  • 得到确认后,可以删除旧文件
  • GridFS是一种黑客特性。最好只使用一个单独的文件服务器和一个真正的文件系统来存储文件内容,而只在MongoDB中存储元数据

        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();