我是mongoDB
中的新用户,我尝试使用数据块将文件上传到GridFS
。意思是,我从我的客户端获取一个分为块的文件,我想将其上传到mongoDB
,因此文件将是一个块的集合。
换句话说,我想在gridFS中实现随机访问。
我该怎么办?以及我如何获得这个文件(再次,在我的mongo.db中分成几部分.Id会是相同的吗?)
应用程序是用node.js
编写的答案 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) {
});
我希望能帮助你。这就是以块的形式阅读/写作。