Hướng dẫn mongodb gridfs example - ví dụ gridfs mongodb

  • Hướng dẫn
  • Gridfs
  • API Gridfs

Trình điều khiển MongoDB Node.js hiện hỗ trợ API dựa trên luồng cho GridFs tương thích với các luồng Node.js, do đó bạn có thể trực tiếp từ các luồng tệp đến MongoDB. Trong hướng dẫn này, bạn sẽ thấy cách sử dụng API phát trực tuyến GridFS mới để tải lên bản ghi âm 28 MB được cấp phép CC từ Richard Wagner, Opera Die Meistersinger von Nurnberg đến MongoDB bằng cách sử dụng các luồng.

Được thiết lập

Chức năng phát trực tuyến GRIDFS mới là một phần của bản phát hành 2.1.0 của trình điều khiển MongoDB Node.js. Để sử dụng nó, hãy đặt sự phụ thuộc sau trong

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
0 của bạn. Chúng tôi thực sự khuyên bạn không nên sử dụng các phiên bản từ GitHub trong sản xuất, nhưng nó rất tốt cho thử nghiệm.

{
  "dependencies": {
    "mongodb": "https://github.com/mongodb/node-mongodb-native/archive/gridfs-specification.tar.gz"
  }
}

Tải lên một tập tin

Bạn có thể sử dụng GridFs để tải tệp lên MongoDB. Ví dụ này giả định rằng bạn có một tệp có tên

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
1 trong thư mục gốc của dự án của bạn. Bạn có thể sử dụng bất kỳ tệp nào bạn muốn hoặc bạn chỉ có thể tải xuống một meistersinger die mp3.

Để sử dụng API phát trực tuyến API, trước tiên bạn cần tạo

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
2.

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});

Xô có phương thức

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
3 tạo luồng tải lên cho một tên tệp đã cho. Bạn có thể đặt một nút.js
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
4 Đọc luồng vào luồng tải lên.

var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});

Giả sử rằng cơ sở dữ liệu

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
5 của bạn trống, bạn sẽ thấy rằng tập lệnh trên đã tạo 2 bộ sưu tập trong cơ sở dữ liệu
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
5 của bạn:
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
7 và
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
8. Bộ sưu tập
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
8 chứa siêu dữ liệu cấp cao về các tệp được lưu trữ trong thùng này. Chẳng hạn, tệp bạn vừa tải lên có một tài liệu trông giống như những gì bạn thấy dưới đây.

> db.fs.files.findOne()
{
	"_id" : ObjectId("561fc381e81346c82d6397bb"),
	"length" : 27847575,
	"chunkSize" : 261120,
	"uploadDate" : ISODate("2015-10-15T15:17:21.819Z"),
	"md5" : "2459f1cdec4d9af39117c3424326d5e5",
	"filename" : "meistersinger.mp3"
}

Tài liệu trên chỉ ra rằng tệp được đặt tên là ‘meistersinger.mp3, và cho bạn biết kích thước của nó bằng byte, khi nó được tải lên và md5 của nội dung. Ngoài ra, còn có một trường

var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
0 chỉ ra rằng tệp được chia thành các khối có kích thước 255 kilobyte, là mặc định.

> db.fs.chunks.count()
107

Không có gì đáng ngạc nhiên, 27847575⁄261120 là khoảng 106,64, do đó, bộ sưu tập

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
7 chứa 106 khối với kích thước 255kb và 1 khối mà khoảng 255kb * 0,64. Mỗi tài liệu khối cá nhân tương tự như tài liệu dưới đây.

> db.fs.chunks.findOne({}, { data: 0 })
{
	"_id" : ObjectId("561fc381e81346c82d6397bc"),
	"files_id" : ObjectId("561fc381e81346c82d6397bb"),
	"n" : 0
}

Tài liệu chunk theo dõi tệp nào thuộc về và thứ tự của nó trong danh sách các khối. Tài liệu chunk cũng có trường

var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
2 chứa các byte thô của tệp.

Bạn có thể định cấu hình cả kích thước chunk và tiền tố

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
4 cho các bộ sưu tập các tệp và khối ở cấp độ xô. Chẳng hạn, nếu bạn chỉ định các tùy chọn
var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
4 và
var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
5 như được hiển thị bên dưới, bạn sẽ nhận được 27195 khối trong bộ sưu tập
var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
6.

var bucket = new mongodb.GridFSBucket(db, {
  chunkSizeBytes: 1024,
  bucketName: 'songs'
});

fs.createReadStream('./meistersinger.mp3').
  pipe(bucket.openUploadStream('meistersinger.mp3')).
  on('error', function(error) {
    assert.ifError(error);
  }).
  on('finish', function() {
    console.log('done!');
    process.exit(0);
  });

Tải xuống một tập tin

Xin chúc mừng, bạn đã tải thành công một tập tin lên MongoDB! Tuy nhiên, một tập tin ngồi trong MongoDB là đặc biệt hữu ích. Để truyền phát tệp vào ổ cứng của bạn, phản hồi HTTP hoặc các mô -đun NPM như loa, bạn sẽ cần một luồng tải xuống. Cách dễ nhất để có được luồng tải xuống là phương thức

var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
7.

var bucket = new mongodb.GridFSBucket(db, {
  chunkSizeBytes: 1024,
  bucketName: 'songs'
});

bucket.openDownloadStreamByName('meistersinger.mp3').
  pipe(fs.createWriteStream('./output.mp3')).
  on('error', function(error) {
    assert.ifError(error);
  }).
  on('finish', function() {
    console.log('done!');
    process.exit(0);
  });

Bây giờ, bạn có một tệp

var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./meistersinger.mp3').
    pipe(bucket.openUploadStream('meistersinger.mp3')).
    on('error', function(error) {
      assert.ifError(error);
    }).
    on('finish', function() {
      console.log('done!');
      process.exit(0);
    });
});
8 mà một bản sao của tệp
mongodb.MongoClient.connect(uri, function(error, db) {
  assert.ifError(error);

  var bucket = new mongodb.GridFSBucket(db);

  // Use bucket...
});
1 gốc. Luồng tải xuống cũng cho phép bạn thực hiện một số thủ thuật gọn gàng. Chẳng hạn, bạn có thể cắt bỏ phần đầu của bài hát bằng cách chỉ định một số byte để bỏ qua. Bạn có thể cắt bỏ 41 giây đầu tiên của MP3 và bỏ qua ngay phần hay của bài hát như được hiển thị bên dưới.

bucket.openDownloadStreamByName('meistersinger.mp3').
  start(1024 * 1585). // <-- skip the first 1585 KB, approximately 41 seconds
  pipe(fs.createWriteStream('./output.mp3')).
  on('error', function(error) {
    assert.ifError(error);
  }).
  on('finish', function() {
    console.log('done!');
    process.exit(0);
  });

Một điểm quan trọng cần lưu ý về hiệu suất là API phát trực tuyến GridFS có thể tải các khối một phần. Khi một luồng tải xuống cần kéo một đoạn từ MongoDB, nó sẽ kéo toàn bộ khối vào bộ nhớ. Kích thước chunk mặc định 255 kilobyte thường là đủ, nhưng bạn có thể giảm kích thước khối để giảm chi phí bộ nhớ.

Tiến lên

Xin chúc mừng, bạn đã sử dụng các luồng MongoDB và Node.js để lưu trữ và thao tác tệp .mp3. Với GridFS, bạn có một hệ thống tệp với tất cả các tính năng mở rộng theo chiều ngang của MongoDB. Nó cũng có API dựa trên luồng mà bạn có thể sử dụng cho các tệp

> db.fs.files.findOne()
{
	"_id" : ObjectId("561fc381e81346c82d6397bb"),
	"length" : 27847575,
	"chunkSize" : 261120,
	"uploadDate" : ISODate("2015-10-15T15:17:21.819Z"),
	"md5" : "2459f1cdec4d9af39117c3424326d5e5",
	"filename" : "meistersinger.mp3"
}
0 đến và từ MongoDB.