使用gridfs-stream

时间:2017-11-21 21:48:14

标签: mongodb gridfs bucket gridfs-stream

使用gridfs-stream,如何在查找和提取文件时指定存储桶名称?

我的问题是在How can I specify a GridFS bucket

上的stackoverflow上找到的以下问题的后续跟进

那里的解决方案提供了一个示例,说明在调用createWriteStream时如何指定存储桶。根据@vsivsi提供的代码,我可以使用' root'将文件添加到我的自定义存储桶中。以下代码中的选项:

// fyi, req.file has been populated using multer
var gfs = Grid(mongoose.connection.db);
var writeStream = gfs.createWriteStream({
    filename: req.file.originalname,
    mode: 'w',
    content_type: req.file.mimetype,
    root: 'private'
});

这成功地将我的文件添加到private.files和private.chunks。 所以现在我想找到并阅读我上传的文件。我的find()不使用桶看起来像这样:

var gfs = Grid(mongoose.connection.db);
gfs.find({
    filename: req.params.filename
}).toArray(function(err, files){ 
     // bunch of processing here... 
});

现在我如何告诉查找要查询的存储桶/根?

我假设我可以使用相同的' root'我调用createReadStream()时的选项,但首先我需要找到它。有没有办法告诉gridfs-stream使用什么桶/根?

1 个答案:

答案 0 :(得分:2)

我想我找到了自己的答案。看一下gridfs-write的源代码,我发现了以下原型:

Grid.prototype.collection = function (name) {
  this.curCol = name || this.curCol || this.mongo.GridStore.DEFAULT_ROOT_COLLECTION;
  return this._col = this.db.collection(this.curCol + ".files");
}

所以我现在可以使用以下内容搜索我的桶:

var gfs = Grid(mongoose.connection.db);
gfs.collection('private').find({
  filename: req.params.filename
}).toArray(function(err, files){
    // handle err and no files...
    let readStream = gfs.createReadStream({
        filename: files[0].filename,
        root: 'private'
    });
    // ... etc. ...
});

希望这可以帮助其他可能来寻找它的人!