我有以下代码(删除错误检查以保持简洁),它使用node-mongodb-native。
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
的最新版驱动程序,它完成了我上面解释的内容。
答案 0 :(得分:3)
与真正的文件系统一样,文件名成为GridFS中用于读写的逻辑键。您不能拥有两个具有相同名称的文件。
您需要提供某种二级索引或新生成的文件名。
例如,为文件名添加时间戳。
或者,创建另一个集合,将生成的文件名映射到GridFS结构,以满足您的需要。
答案 1 :(得分:0)
为避免为文件创建其他唯一标识符,您应省略“写入模式”选项。这将允许gridfs创建一个新文件,即使它包含完全相同的数据。
'w'会覆盖数据,这就是你要覆盖现有文件的原因。
http://mongodb.github.io/node-mongodb-native/api-generated/gridstore.html