MongoDb GridFs更新Java

MongoDb GridFs更新Java,java,mongodb,gridfs,Java,Mongodb,Gridfs,MongoDB以a的形式为java中的GridFS提供了一个很好的驱动程序,但是,在发布api v3.2时没有提供更新命令,因此我们必须同时执行删除和插入操作。我担心并发性问题,尽管我尽了最大努力研究它,但我仍然不太了解Mongo如何处理锁定。例如,mongo的api在python中有以下示例: def update_photo_content(input_file, section, slug): # 1 fs = GridFS(db, 'cms.ass

MongoDB以a的形式为java中的GridFS提供了一个很好的驱动程序,但是,在发布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行,什么是mongoshell/java等价物,这是访问数据库吗

至于锁,它似乎不是mongo服务器使用的任何特殊字段,所以我是否需要在我的驱动程序中使用繁忙的等待或其他内容来解释它,或者我是否缺少mongo如何处理它

我更愿意在文件更新后保留相同的id,
因此可能对我不起作用

我相信您从MongoDB文档中的用例中获得了示例代码

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

因为上传照片跨越多个文档,并且是一个非原子操作,所以在上传过程中必须通过在记录中写入datetime.utcnow来“锁定”文件

GridFS不是一种服务器端功能,而是一种约定,用于在MongoDB中存储大于BSON文档大小限制16MB的文件。GridFS没有服务器强制的特性,您可以随意解释或误解GridFS集合中存储的内容

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

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