我想将用户选择的文件保存到MongoDB。如何将文件正确添加到BSON对象以将其添加到MongoDB?如果我的方法不正确,请指出正确的方向。
以下是客户端代码。这个jQuery函数在每个输入字段上收集文本(需要文件部分的帮助),并将其作为BSON对象发送到服务器。
$('#add').click(function()
{
console.log('Creating JSON object...');
var classCode = $('#classCode').val();
var professor = $('#professor').val();
var description = $('#description').val();
var file = $('#file').val();
var document =
{
'classCode':classCode,
'professor':professor,
'description':description,
'file':file,
'dateUploaded':new Date(),
'rating':0
};
console.log('Adding document.');
socket.emit('addDocument', document);
});
表单的HTML:
<form>
<input type = 'text' placeholder = 'Class code' id = 'classCode'/>
<input type = 'text' placeholder = 'Document description' id = 'description'/>
<input type = 'text' placeholder = 'Professor' id = 'professor'/>
<input type = 'file' id = 'file'/>
<input type = 'submit' id = 'add'/>
</form>
CoffeeScript中的服务器端代码:
#Uploads a document to the server. documentData is sent via javascript from submit.html
socket.on 'addDocument', (documentData) ->
console.log 'Adding document: ' + documentData
db.collection 'documents', (err, collection) ->
collection.insert documentData, safe:false
return
答案 0 :(得分:33)
如果你的文件足够小(16兆字节以下),你可以将文件嵌入到BSON文件中,而不是增加GridFS的复杂性。
BSON具有二进制数据类型,任何驱动程序都应该为其提供访问权限。
如果您的文件是文本文件,则可以将其存储为UTF8字符串。
答案 1 :(得分:14)
答案 2 :(得分:2)
来自官方文件:https://docs.mongodb.com/manual/core/gridfs/#when-to-use-gridfs
在MongoDB中,使用GridFS存储大于16 MB的文件。
在某些情况下,在MongoDB数据库中存储大文件可能比在系统级文件系统上更有效。
如果您的文件系统限制了目录中的文件数,您可以使用GridFS根据需要存储任意数量的文件。
如果要从大文件的各个部分访问信息而不必将整个文件加载到内存中,可以使用GridFS调用文件的各个部分,而无需将整个文件读入内存。
如果要在多个系统和设施中自动同步和部署文件和元数据,可以使用GridFS。使用地理位置分散的副本集时,MongoDB可以自动将文件及其元数据分发到许多mongod实例和设施。
如果需要以原子方式更新整个文件的内容,请不要使用GridFS。作为替代方案,您可以存储每个文件的多个版本,并在元数据中指定文件的当前版本。您可以在上载新版本的文件后更新在原子更新中指示“最新”状态的元数据字段,然后在需要时删除以前的版本。
此外,如果您的文件都小于16 MB BSON文档大小限制,请考虑将文件手动存储在单个文档中,而不是使用GridFS。您可以使用BinData数据类型来存储二进制数据。有关使用BinData的详细信息,请参阅驱动程序文档。