当前位置: 首页 > 面试题库 >

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

阮梓
2023-03-14
问题内容

我使用的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();

问题答案:

在GridFS中,您不是要删除/删除单个文档,而是实际上要删除一堆文档(文件分为多个块,每个块都是一个单独的文档)。这意味着根本不可能以原子方式替换文件。

您可以做的是:

  1. 插入一个具有新名称的新文件
  2. 发生这种情况之后(使用已 确认副本的复制 关注),将所有对旧文件的引用更新为指向新文件
  3. 确认后,您可以删除旧文件

GridFS是一种hackish功能。通常最好只使用带有真实文件系统的单独文件服务器来存储文件内容,并且仅将元数据存储在MongoDB中。



 类似资料:
  • 我第一次尝试执行批量插入/更新操作。我正在使用Mybatis注释(映射器)执行与数据库相关的操作。 我有一个@Param,它是列表 映射器将具有: ****我不确定到底是做什么的。如果有人能对它有所了解,我会非常感激。**** 我在关注@Repository- 例如Controller类有: 此外,有多少批量插入的记录以上的方法将能够处理?(记录可以范围从5000到50000) 附言:-这也是我第

  • 查看Postgres 9.4数据类型JSONB的留档,我不知道如何对JSONB列进行更新。 JSONB类型和函数的文档: http://www.postgresql.org/docs/9.4/static/functions-json.html http://www.postgresql.org/docs/9.4/static/datatype-json.html 举个例子,我有一个基本的表格结构

  • 在PostgreSQL 9.5中出现了冲突更新/无操作功能。创建服务器和外部表将在PostgreSQL 9.2版本中出现。 当我对外部表使用ON CONFLICT DO UPDATE时,它不起作用,但当我对普通表运行相同的查询时,它起作用。下面给出了问题。 //对于普通表 O/P:查询成功返回:一行受影响,执行时间为5毫秒。 //对于外部表概念 //foreign_app为foreign tabl

  • 我有一个这样的数据集 我想选择第3列和第4列作为我的键和值,我如何在Apache Flink中执行平均操作。 我最多能做到“按键分组”。但是我无法对每个键的值执行平均运算。

  • 问题内容: 我是SSH和JSch的新手。当我从客户端连接到服务器时,我想做两个任务: 上传文件(使用) 执行命令,例如创建目录,以及搜索MySQL数据库 目前,我正在使用两个单独的Shell登录名来执行每个任务(实际上我还没有开始对MySQL查询进行编程)。 对于上传,相关代码为 而对于我的命令 我应该在第一个频道之后断开会话,然后再打开第二个频道吗?还是完全关闭会话并打开一个新会话?如我所说,我

  • 我有一个猫鼬模式 我最初设置了名称和电话字段的集合。我需要将集合更新为消息数组中的新消息和新地址到地址对象中。该函数还必须处理任何单个操作,即在某些情况下我只更新到消息数组或更新到名称和地址。所以我如何在单个函数中执行所有操作。