[英]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.