有没有办法在couchdb视图中发出附件数据

dee*_*ter 13 mobile couchdb

我发现在图像显示网站上的数据时使用CouchDB附件非常有用.但是,当我将数据库复制到移动环境时,运行视图然后必须遍历文档以访问其附件是非常低效的.在iOS/Android平台似乎很多更有效地存储数据定期BLOB和有只有一个视图的查询,发出摆在首位的所有文档数据视图的查询访问所有的二进制数据.有没有办法在我的map函数中读取附件DATA,并将其包含在emit语句中.我看到有通过_attachments提供的附件信息,但这不提供对数据的访问.

更新 的主要缺点(在接受的答案不详述)使用BLOB的文件本身,而不是在附件是,当您更新文档,你必须得到整个文档,然后将它张贴回来.如果您不使用附件,则必须获取所有二进制数据,而不是附件.如果您要对文档执行更新,使用附件实际上是设计二进制数据的唯一合理方法.

Jas*_*ith 15

你遇到了一个很棒的问题!

什么是附件?

是二进制数据吗?好吧,您可以对Base64进行编码并将其直接存储在文档中(类似于数据URI).你当然可以有文本或application/json附件.所以不是那样的.

是直接下载吗?并不是的.通过显示和列表功能,您可以直接提供文档的任何部分(或根据文档数据构建新内容).

那么,什么是附件?对我来说,附件的工作定义是,视图,节目和列表中无法访问的数据.这是一个优化.您无法从服务器端Javascript访问它; 但是你获得了速度,因为CouchDB不需要对大量数据进行编码和解码.

有时我也会像C指针一样思考它.使用指针非常快.它们是一种小而简单的数据类型.但是,成本是额外的编程工作,因为必须取消引用才能获取数据.你总是有一个额外的步骤.这就是速度的代价.CouchDB附件类似.

如果您的数据很小(可能是favicons,vcards,text)并且适合整个文档,那就去吧!不要附上它们.但是,对于大多数图像和其他文件等较大的数据,附件变得必要.

多次抓取

假设您查询视图并在屏幕上显示20行.现在您必须获取20个图像附件.

程序员本能地发现这不受欢迎.而且,是的,这可能是一个交易破坏者.然而,在许多情况下,这是一个很好的权衡.唐纳德克努特说,"过早的优化是所有邪恶的根源." 在SSD支持的情况下,从本地服务器中获取21次总数会让我们失望吗?

在许多情况下,可以进行20次查询.关键是要同时制作它们.CouchDB(和移动数据库)针对并发请求进行了优化.您会发现获取20个图像与获取图像的时间基本相同.

同时获取HTTP资源在每种语言中的工作方式都不同.在Javascript中,它非常简单,需要使用async.js的几行代码.

// Assuming fetch_image(), and images = ['alice.png', 'bob.png',  etc.]
async.forEach(images, fetch_image, function(er) {
  if(er) throw er
  console.log('Fetched 20 images!')
})
Run Code Online (Sandbox Code Playgroud)