2013-01-13 68 views
0

我有以下代碼(刪除錯誤檢查以保持簡潔),它使用node-mongodb-native。NodeJS中的MongoDB GridFS驅動程序覆蓋同名文件

var mongo = require('mongodb').MongoClient; 
var grid = require('mongodb').GridStore; 
var url = 'mongodb://localhost:27017/mydatabase'; 

mongo.connect(url, function(err, db) { 
    var gs = new grid(db, 'myfile.txt', 'w', { 
     "metadata": { 
      // metadata here 
     } 
    }); 
    gs.open(function(err, store) { 
     gs.writeFile('~/myfile.txt', function(err, doc) { 
      fs.unlink(req.files.save.path, function (err) { 
       // error checking etc 
      }); 
     } 
    }); 
}); 

如果我運行它,一旦它工作正常,並將文件存儲在GridFS中。

現在,如果我在我的系統上刪除該文件,並創建一個具有相同名稱但內容不同的新文件,並再次通過該代碼運行它,則會上傳它。但是,它似乎覆蓋了已存儲在GridFS中的文件。 _id保持不變,但md5已更新爲新值。所以即使文件不同,因爲名稱是相同的,它會覆蓋GridFS中的當前文件。

有沒有辦法上傳兩個同名的文件?如果_id是唯一的,那麼驅動程序爲什麼只根據文件名來覆蓋文件?

我在GitHub上發現了一個similar issue,但我使用npm的驅動程序的最新版本,它按照上面的解釋進行操作。

回答

3

與真實的文件系統一樣,文件名成爲GridFS中用於讀寫的邏輯鍵。你不能有兩個同名的文件。

你需要想出某種類型的二級索引或新生成的文件名。

例如,爲文件名添加時間戳。

或者,創建另一個集合,將生成的文件名映射到GridFS結構,無論您需要什麼。

+0

我明白你的意思了。在更全面地查看文檔時,它看起來像文件名實際上是可選的。我只是將它放在元數據中查詢並忘記文件名字段本身。 [文件集合](http://docs.mongodb.org/manual/applications/gridfs/#the-files-collection) – BytesGuy

相關問題