从GridFS上传并获取块(mongodb)

时间:2014-05-29 14:26:00

标签: node.js mongodb gridfs chunks

我是mongoDB中的新用户,我尝试使用数据块将文件上传到GridFS。意思是,我从我的客户端获取一个分为块的文件,我想将其上传到mongoDB,因此文件将是一个块的集合。

换句话说,我想在gridFS中实现随机访问。

我该怎么办?以及我如何获得这个文件(再次,在我的mongo.db中分成几部分.Id会是相同的吗?)

应用程序是用node.js

编写的

1 个答案:

答案 0 :(得分:2)

通常在节点顺序中,数据块是使用streams处理的,如果在这种情况下,如果您正在处理流,那么gridfs-stream module是您最好的选择。检查示例以及stream handbook。你可以通过将一个流管道到其中来编写一个文件,或者通过将文件传输到另一个流来读取文件。

如果您还没有流,也可以手动使用。要编写数据,您只需使用节点.write.end方法:

var mongo = require('mongodb');
var Grid = require('gridfs-stream');

// create or use an existing mongodb-native db instance
var db = new mongo.Db('yourDatabaseName', new mongo.Server("127.0.0.1", 27017));
var gfs = Grid(db, mongo);

// streaming to gridfs
var writestream = gfs.createWriteStream({
    filename: 'my_file.txt'
});

writestream.write('this is a line\n');
writestream.write('second line coming some time after\n');
writestream.write('last line');
writestream.end();// Add the EOF marker and finish the file writing.

或从文件中读取:

var readstream = gfs.createReadStream({
  filename: 'my_file.txt'
});

readstream.on('data', function (data) {
    // We got a buffer of data...
});
readstream.on('end', function () {
    // File finished reading...
});

请注意,此处仅使用旧API。对于新的api,你必须包装流。

如果您想每次更改正在读取的数据量,可以传递chunkSize选项。

现在,如果您的数据没有按顺序进出,或者您希望更接近金属(更低级别),则可以使用mongodb gridstore API

对于写入文件,您应该使用gridstore实例的write方法:

var Db = require('mongodb').Db,
    Server = require('mongodb').Server,
    ObjectID = require('mongodb').ObjectID;

var db = new Db('test', new Server('localhost', 27017));
// Establish connection to db
db.open(function(err, db) {
  // Our file ID
  var fileId = new ObjectID();

  // Open a new file
  var gridStore = new GridStore(db, fileId, 'w');

  // Open the new file
  gridStore.open(function(err, gridStore) {

    // Write a text string
    gridStore.write('Hello world', function(err, gridStore) {

      // Write a buffer
      gridStore.write(new Buffer('Buffer Hello world'), function(err, gridStore) {

        // Close the file...
        gridStore.close(function(err, result) {});
      });
    });
  });
});

如果您想要随机写入,可以通过调用.seek方法来更改写入位置。

对于阅读,您可以使用与.read方法几乎相同的.write方法:

gs.seek(0, function() {
  // Read 1024 bytes...
  gs.read(1024, function(err, data) {
    // Now go to position 2048
    gs.seek(2048, function () {
      // Read another 1024 bytes...
      gs.read(1024, function(err, data) {
      });      
    });
  });
});

还有GridStore.read方法。这是上述功能的更高级别方法:

// Read 1024 bytes starting from the byte 2048.
GridStore.read(db, 'file1', 1024, 2048, function (err, data) {

});

我希望能帮助你。这就是以块的形式阅读/写作。