java - MongoDb GridFs 更新 Java

标签 java mongodb gridfs

MongoDB 为 Java 中的 GridFS 提供了一个很棒的驱动程序,其形式为 GridFSBucket但是,截至发布时,api (v3.2) 不提供更新命令,因此我们必须同时执行删除和插入操作。我担心并发问题,尽管我尽了最大努力研究它,但我仍然不太明白 Mongo 如何处理锁定。例如,mongo 的 api 在 python 中有这个示例:

 def update_photo_content(input_file, section, slug):                   # 1
 fs = GridFS(db, 'cms.assets')                                          # 2
                                                                        # 3
 # Delete the old version if it's unlocked or was locked more than 5    # 4
 #    minutes ago                                                       # 5
 file_obj = db.cms.assets.find_one(                                     # 6
     { 'metadata.section': section,                                     # 7
       'metadata.slug': slug,                                           # 8
       'metadata.locked': None })                                       # 9
 if file_obj is None:                                                   #10
     threshold = datetime.utcnow() - timedelta(seconds=300)             #11
     file_obj = db.cms.assets.find_one(                                 #12
         { 'metadata.section': section,                                 #13
           'metadata.slug': slug,                                       #14
           'metadata.locked': { '$lt': threshold } })                   #15
 if file_obj is None: raise FileDoesNotExist()                          #16
 fs.delete(file_obj['_id'])                                             #17
                                                                        #18
 # update content, keep metadata unchanged                              #19
 file_obj['locked'] = datetime.utcnow()                                 #20
 with fs.new_file(**file_obj):                                          #21
     while True:                                                        #22
         chunk = input_file.read(upload_file.chunk_size)                #23
         if not chunk: break                                            #24
         upload_file.write(chunk)                                       #25
 # unlock the file                                                      #26
 db.assets.files.update(                                                #27
     {'_id': upload_file._id},                                          #28
     {'$set': { 'locked': None } } )                                    #29

但我不知道python驱动程序中的哪些方法实际访问数据库,或者理解锁

例如,第 17 行,mongo shell/java 等价物是什么,这是在访问数据库吗?

对于锁,它似乎不是 mongo 服务器使用的任何特殊字段,所以我是否需要通过繁忙的等待或驱动程序中的某些内容来解释它,或者我是否缺少 mongo 处理它的方式?

我希望在文件更新后保留相同的 ID, 所以this answer可能不适合我

最佳答案

我相信您从 Metadata and Asset Management 获取了示例代码MongoDB 文档中的用例。

请注意,用例的锁定机制根本不由 MongoDB 服务器处理。锁定是在应用程序级别完成的。从相关页面:

Because uploading the photo spans multiple documents and is a non-atomic operation, you must “lock” the file during upload by writing datetime.utcnow() in the record.

GridFS 不是服务器端功能,而是关于如何在 MongoDB 中存储大于 BSON 文档大小限制 16 MB 的文件的约定。 GridFS 没有服务器强制的功能,您可以根据需要自由解释(或误解)GridFS 集合中存储的内容(请参阅 GridFS collections )。

答案https://stackoverflow.com/a/30074812/5619724中提出的方法可能是更新 GridFS 文件最直接的方法。当然,如果您愿意,您可以在应用程序中自由地执行更复杂的锁定机制。

关于您希望为更新的文件保留相同的 ID,请注意,您不需要依赖 MongoDB 提供的 ObjectId。 GridFS 约定允许您将任何元数据放入 the metadata field 中。您可以将您的唯一 ID 放入此字段中。

关于java - MongoDb GridFs 更新 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44810589/

相关文章:

Java 错误 : incorrect time in MSK

arrays - MongoDB 和数组上的覆盖索引可能吗?

java - 蒙戈错误: Spring Boot throws E11000 duplicate key error

java - ScrollBar 和 JTable 选择的问题

java - JPanel 位置被 BufferStrategy 重击

java - 没有获取 PLAY_LANG 的正确值

mongodb - 如何使用 JUJU 登录/使用已部署的服务

node.js - 我正在尝试使用nodejs将图像存储在mongo gridfs中

Node.js 通过 REST API 发送图像

javascript - 使用 gridfs-stream 执行 find() 时如何指定 GridFS 存储桶