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

时间:2012-04-05 22:12:39

标签: mobile couchdb

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

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

1 个答案:

答案 0 :(得分:14)

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

什么是附件?

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

是直接下载吗?并不是的。 Show and list functions允许您直接提供文档的任何部分(或根据文档数据构建新内容)。

那么 附件是什么?对我来说,附件的工作定义是在视图,节目和列表中无法访问的数据。这是一个优化。您无法从服务器端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!')
})