29

我想将用户选择的文件保存到 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
4

3 回答 3

45

如果您的文件足够小(小于 16 兆字节),您可以将文件嵌入到 BSON 文档中,而不是增加 GridFS 的复杂性。

BSON 具有二进制数据类型,任何驱动程序都应提供对其的访问权限。

如果您的文件是文本文件,您可以将其存储为 UTF8 字符串。

于 2012-12-17T23:05:05.910 回答
20

要将文件存储在 MongoDB 中,您应该尝试使用GridFS
您可以找到一些关于使用 GridFS 的教程(示例)。
检查您的 MongoDB 驱动程序的 API 并尝试在您的项目中实现它

于 2012-12-17T02:47:54.340 回答
4

何时使用 GridFS

来自官方文档: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 的详细信息,请参阅您的驱动程序文档。

于 2018-03-12T11:29:20.797 回答