正如在GridFS doc中可以看到的那样,BSON对象的大小有限.因此,如果我想存储一些非常大的东西,我需要将其分块.它将是fs.files集合中的文档.我的问题是:有没有办法在文档中包含大量字段.这样就可以在不查看fs.files集合的情况下找到它.
先感谢您!
在使用mongo gem的ruby中,我找不到任何关于如何使用GridFs查找文件名的文档.
我有一个nodejs应用程序,它使用Mongo和GridFS来存储图像.我试图通过Node.js(使用快速框架)将这些图像显示到浏览器.
我目前正在使用:
res.writeHead(200, {'Content-Type': 'image/jpeg' });
res.end(imageStore.currentChunk.data.buffer, 'binary');
Run Code Online (Sandbox Code Playgroud)
在创建新的GridStore并调用gridStore.open(...)之后,imageStore是gridStore对象
var gridStore = new GridStore(self.collection.db, doc._id, doc.filename, 'r', {
chunk_size: doc.chunkSize
});
gridStore.open(callback);
Run Code Online (Sandbox Code Playgroud)
我确定这不是正确的方法,它会显示破碎的图像.有什么建议?
谢谢!
编辑:
更新到mongodb native 1.0.2之后,我正在尝试使用以下方法来传输数据:
res.contentType("image/jpeg");
var imageStream = imageStore.stream(true);
imageStream.pipe(res);
Run Code Online (Sandbox Code Playgroud)
imageStore是使用后的对象 gridStore.open(function(err, imageStore){ })
如何通过mongo shell将文件"上传"到我的MongoDB以及如何检索同一个文件?我想知道,在这样做之后,甚至是什么输出.
我认为展示我所做的将表明我的尝试是多么愚蠢.
db.fs.files.insert("foo.txt");
Run Code Online (Sandbox Code Playgroud)
这似乎只是插入实际的文本而不是我想要的文件......并且要检索,我发现了
db.fs.files.retrieve()
Run Code Online (Sandbox Code Playgroud)
不是一个功能.,find()只显示给我...但是我想要打印实际文档的内容,无论是BINARY数据还是w/e我都不在乎,哈哈.
对于这种悲惨的尝试我感到很遗憾 - 但也许它表明我对GridFS可以做什么知之甚少 - 也许有人可以在使用之外为我清除这一点.
我一直在使用perl,MongoDB和GridFS进行一些宠物开发,并且想知道 - 无论如何perl与Mongofiles接口(除了用系统命令导航并用它调用它,嘿) - 就像..well. ..a cpan库?或者是Mongo当前CPAN模块的扩展?
举个例子来说明我想做的事情:
我希望能够将文件存储到我的mongoDB中并将文件检索到我的mongoDB中 - 例如,从命令行导出,一旦我导航到其中包含mongofiles的目录,我就可以执行
mongofiles put "C:\Users\Me\cool.txt"
Run Code Online (Sandbox Code Playgroud)
它会将文件存储到数据库中!假设我从驱动器上删除了cool.txt.现在我执行时:
mongofiles get "C:\Users\Me\cool.txt"
Run Code Online (Sandbox Code Playgroud)
它从数据库中检索文件并将其放在我的目录中!我只是希望能够从Perl访问这个mongofiles功能.即使这意味着在我的脚本目录中有mongofiles的副本.
我正在做一些测试,看看我们是否可以在MongoDB上使用GridFS来存储未来应用程序的文件; 我正在使用10gen的C#驱动程序将80Mb文件"上传"到数据库中.
第一次添加很好,花了大约3秒钟,这对我的测试机器来说并不算太糟糕; 然而,未来相同文件的添加需要更长时间,最多30秒,MongoDB最终告诉我内存耗尽并崩溃.
在系统崩溃命名dbaseName.0到dbaseName.7之前,添加10个文件,大小为80Mb会导致为我的数据库创建8个文件,文件大小从文件0到5从16Mb到512Mb呈指数级增长,然后文件6和7都是512MB.
这些文件的价格低于2Gb,显然第10次添加文件需要dbase超过2Gb,这超出了我的32位测试版本的限制.
为什么存储800Mb的文件需要超过2Gb?有没有我错过的地方?
MongoDB是否经常在RAM中保存整个GridFS?如果是这样的话,磁盘有什么意义呢?如果我的生产服务器上只有32Gb的RAM,那么我只能在GridFS中存储32Gb吗?
我在MongoGridFS对象上使用了EnsureIndexes,并检查了显示为GridFS创建索引的数据库,所以Mongo不应该尝试将整个数据存储区放入RAM中吗?
MongoDB满足我们的所有需求,但我们需要它能够容纳大型文件集; 我错过了一些明显的东西吗
堆栈跟踪:
Mon Oct 15 11:57:15 [conn15] insert busyNow.fs.chunks keyUpdates:0 locks(micros) w:112892 113ms
Mon Oct 15 11:57:15 [conn15] MapViewOfFileEx for /data/db/busyNow.7 failed with errno:8 Not enough storage is available to process this command. (file size is 536608768) in MemoryMappedFile::map
Mon Oct 15 11:57:15 [conn15] busyNow.fs.chunks Fatal Assertion 16166
Mon Oct 15 11:57:17 [conn15] mongod.exe ...\src\mongo\util\assert_util.cpp(124) mongo::fassertFailed+0x75
Mon Oct 15 11:57:17 [conn15] mongod.exe ...\src\mongo\util\mmap_win.cpp(211) mongo::MemoryMappedFile::map+0x4ce
Mon Oct 15 11:57:17 [conn15] mongod.exe …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用节点0.10.1,表达3.1.1,mongoose 3.6.4,mongo 2.4.1和gridfs-stream 0.4.0.
我已经使用共享连接设置了mongoose和gridfs-stream,如下所示:
/************* app.js ***************/
//Added this in edit to show setup of mongoose and gridfs-stream
var mongoose = require("mongoose");
var Grid = require('gridfs-stream');
Grid.mongo = mongoose.mongo;
global.conn = mongoose.createConnection(dbUri);
conn.once('open', function(){
global.gfs = Grid(conn.db);
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用gridfs-stream上传/下载文件.我上传的内容如下:
exports.uploadFile = function(req, res){
var file = req.files.upload;
var docId = mongoose.Types.ObjectId(req.query.docId);
var filename = req.query.ileName;
var contentType = file.type;
if(!file) return res.send({result: 'NO_FILE_UPLOADED'});
var writestream = gfs.createWriteStream({
_id: docId,
filename: filename,
mode: 'w',
root: 'documents'
});
// more here …Run Code Online (Sandbox Code Playgroud) 文档提到可以使用gridFS检索一系列文档.但是我还没有找到任何关于此的细节.我想使用java驱动程序获取一个文件范围,用于支持音频流的grails应用程序.在这种情况下,我是否需要手动获取和组装软件包?还是有更好的方法吗?
我正在玩mongodb(GridFS)来存储文件(zip)并尝试使用python的"pymongo"检索它们但是它没有按预期工作我无法理解如何检索我添加的文件...
下面是我从IDLE运行的代码(Python 3.4.1)
>>> db = Connection(port=31000, host="localhost").fs
>>> db.name
'fs'
>>> db.validate_collection
<bound method Database.validate_collection of Database(Connection('localhost', 31000), 'fs')>
>>> blob_store = gridfs.GridFS(db, collection='bstore')
>>> local_db = dict()
>>> k = r'd:\test\my-scripts.zip'
>>> local_db[k] = blob_store.put(open(k, 'rb'))
[** File is saved, i checked using robomongo **]
>>> blob_store.exists(filename=k)
False
>>> blob_store.exists("53da7cb1b3b44b13e0e27721")
False
>>> local_db
{'d:\\test\\my-scripts.zip': ObjectId('53da7cb1b3b44b13e0e27721')}
>>> blob_store.list()
[]
>>> b = gridfs.GridFS(db, collection='bstore.files')
>>> b.list()
[]
>>> x = blob_store.get(Objectid("53da7cb1b3b44b13e0e27721"))
Traceback (most recent call last):
File "<pyshell#20>", line …Run Code Online (Sandbox Code Playgroud) 我使用 GridFS 如下:
connection = MongoClient(host='localhost')
db = connection.gridfs_example
fs = gridfs.GridFS(db)
fileId = fs.put("Contents of my file", key='s1')
Run Code Online (Sandbox Code Playgroud)
在文件最初存储在 GridFS 中之后,我有一个计算与文件内容相关的附加元数据的过程。
def qcFile(fileId):
#DO QC
return "QC PASSED"
qcResult = qcFile(fileId)
Run Code Online (Sandbox Code Playgroud)
如果我能做到,那就太好了:
fs.update(fileId, QC_RESULT = qcResult)
Run Code Online (Sandbox Code Playgroud)
但该选项似乎不存在于文档中。我在这里发现(问题更新了解决方案)Java 驱动程序似乎提供了一个选项来执行这样的操作,但在 python gridfs 中找不到它的等效项。
那么,如何使用 pymongo 用新计算的元数据值标记我的文件qcResult?我在文档中找不到它。