【问题标题】:How do I save a file to MongoDB?如何将文件保存到 MongoDB?
【发布时间】:2012-12-17 02:18:44
【问题描述】:

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

【问题讨论】:

    标签: mongodb file-upload


    【解决方案1】:

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

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

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

    【讨论】:

    • 你能举例说明如何使用这种类型吗?我的文件系统上有文件 - 如何将其放入数据库?
    • 在没有 Gridfs 的情况下上传小文件时,我也没有任何好的文档或示例
    • 您可以发布一个关于如何将驱动程序的二进制数据类型与文件中的数据一起使用的新问题。
    【解决方案2】:

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

    【讨论】:

    • 我一直在阅读有关 GridFS 的信息,但我找不到一个示例来说明如何将文件从客户端发送到服务器以便将其保存在 GridFS 中。有资源吗?
    • 我不擅长 Node.js,但是你可以看看一些教程(gist.github.com/1071705prazjain.wordpress.com/2012/04/18/…)。在本教程中,他们将文件保存到常规文件系统,您应该将 fs 替换为 GridFS 代码
    • 首先,尝试将文件上传到您的文件系统,以确保您的代码正常工作。然后将其替换为GridFs
    • 哦,我想我可以直接将文件从客户端保存到服务器端的数据库中,而无需先将其临时存储在服务器的文件系统中。无论如何,感谢我将继续阅读的链接。
    • 您可以从服务器端将其保存到 GridFS。我告诉您将文件保存到fs 只是为了测试您的上传功能是否有效。然后实现GridFS 而不是filesystem
    【解决方案3】:

    何时使用 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 的详细信息,请参阅您的驱动程序文档。

    【讨论】:

    • 先生,我有一个问题
    猜你喜欢
    • 2019-09-04
    • 2015-11-16
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2015-12-01
    • 2021-12-18
    相关资源
    最近更新 更多