我在MAC上找到了CouchDB 3.1.0数据库的存储位置,但没有找到任何作为文件的附加文档。/Users/jacobidigo/Library/Application Support/CouchDB2/var/lib/couchdb
当我刚开始了解这一点时,它本希望在上面找到文件,比如jsons文档,毕竟它是一个json文档数据库,但我发现了.couche文件存储数据库,用文本编辑器打开它,它是二进制数据和附加的jsons内容的混合体。在后端,它似乎不是真正的json。
我创建了一个测试数据库,加载了一些json,并附上了,检查数据库大小,然后附上了一个46.9Mb的文件(couchdb安装程序本身(,看起来数据库大小增长到47Mb。
对于我的应用程序来说,这是不希望的,因为附件可以是直接从HTML输出链接的引文、图像、手册等。
有没有办法告诉CouchDB将附件作为单独的文件处理,而不是在database.couch文件中处理
-
我不需要存储二进制文件的多个修订
-
我认为它根本不会被压缩到数据库中。这样的文件,它就在那里
-
我认为CouchDB也无法搜索附件内部,我也不需要它。
-
我不认为CouchDB会检测到重复的附件
-
我确实需要通过HTTP服务并复制到节点
-
我确实想在上传后重命名文件
-
我确实想避免重复的文件
-
我确实想避免第三层,比如带有php的apachehttp服务器,因为我的目标是实现尽可能简单的两层应用程序
我在网上搜索过,但发现了许多旧的和过时的评论文章,然后我不知道在当前版本下这是否是不可能的。
正如您所发现的,CouchDB使用json,但不将单个json文档作为文件存储在文件系统中。这是有充分理由的,并不意味着CouchDB就是一个json文档存储。CouchDB使用自己巧妙的类似b-tree的文件格式,而不必依赖文件系统,因为文件系统对其减少映射索引的效率非常低。
正如你所发现的,在CouchDB中存储二进制Blob会带来成本和权衡,如果你主要(或大量(将其用作块存储,你就无法充分利用它。偶尔的小附件也很好。
一个好的模式是将附件存储在其他地方,并且只在CouchDB中存储元数据。没有内置的支持,但原理是直接的:当客户端代码创建一个带有附件的文档时,它首先将附件存储在有意义的地方(文件系统上的文件、S3存储桶或您选择的块存储(,一旦此操作完成,就将引用(文件路径或S3密钥,或…(存储在文档json中。
在获取该文档时,客户端读取附件引用并从块存储中获取附件。
额外的客户端工作,是的,显然你仍然需要访问块存储。
在Cloudant,我们在各种博客文章中探讨了这方面的元素。实际使用的技术不会直接适用于你,但你可能会发现讨论很有帮助。