[英]MongoDb GridFs update Java
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,因此此答案可能对我不起作用
我相信您从MongoDB文档中的元数据和资产管理用例中获得了示例代码。
请注意,用例的锁定机制完全不由MongoDB服务器处理。 锁定在应用程序级别完成。 在相关页面中:
由于上载照片跨越多个文档并且是非原子操作,因此您必须在上载期间通过在记录中写入datetime.utcnow()来“锁定”文件。
GridFS不是服务器端功能,而是关于如何将大于BSON文档大小限制(16 MB)的文件存储在MongoDB中的约定。 GridFS没有服务器强制的功能,您可以随意解释(或错误解释)GridFS集合中存储的内容(请参阅GridFS集合 )。
答案https://stackoverflow.com/a/30074812/5619724中介绍的方法可能是更新GridFS文件的最直接的方法。 当然,您可以随意在应用程序中执行更复杂的锁定机制。
关于您希望为更新文件保留相同的ID,请注意,您不必依赖MongoDB提供的ObjectId
。 GridFS约定允许您将任何元数据放入元数据字段中 。 您可以在此字段中输入唯一ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.