0

我有以下使用 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 上发现了一个类似的问题,但我使用的是最新版本的驱动程序npm,它完成了我上面解释的操作。

4

2 回答 2

3

就像一个真正的文件系统一样,文件名成为 GridFS 中用于读写的逻辑键。您不能有两个同名的文件。

您需要提供某种二级索引或新生成的文件名。

例如,为文件名添加时间戳。

或者,创建另一个集合,将生成的文件名映射到 GridFS 结构到您需要的任何内容。

于 2013-01-13T17:06:50.317 回答
0

为了避免为您的文件创建额外的唯一标识符,您应该省略“写入模式”选项。这将允许 gridfs 创建一个新文件,即使它包含完全相同的数据。

'w' 覆盖数据,这就是覆盖现有文件的原因。

http://mongodb.github.io/node-mongodb-native/api-generated/gridstore.html

于 2014-02-22T12:39:45.937 回答