18

如何在 CouchDB 中的视图之间共享代码?

示例 1 -- 实用方法

Jesse Hallett有一些很好的实用方法,包括

function dot(attr) {
  return function(obj) {
      return obj[attr];
  }
}

Array.prototype.map = function(func) {
  var i, r = [],
  for (i = 0; i < this.length; i += 1) {
    r[i] = func(this[i]);
  }
  return r;
};

...

我可以把这段代码放在哪里,以便每个视图都可以访问它?

示例 2——常量

同样对于我在我的应用程序中使用的常量。我在哪里放

MyApp = {
  A_CONSTANT = "...";
  ANOTHER_CONSTANT = "...";
};

示例 3——过滤器的过滤器:

如果我想要一个按“这是一个有钱人吗?”过滤的视图怎么办:

function(doc) {
  if (doc.type == 'person' && doc.net_worth > 1000000) {
    emit(doc.id, doc);
  }
}

另一个按姓氏索引:

function(doc) {
  if (doc.last_name) {
    emit(doc.last_name, doc);
  }
}

如何将它们组合成“姓氏富人”视图?

我有点想要 Ruby 的等价物

my_array.select { |x| x.person? }.select { |x| x.net_worth > 1,000,000 }.map { |x| [x.last_name, x] }

我怎样才能成为 DRYer?

4

5 回答 5

23

根据这篇博文,您可以通过在您的视图对象中添加一个名为 lib 的键,将 commonjs 模块添加到 couchdb 1.1 视图中的map 函数(但不是 reduce 函数)。许多流行的 javascript 库(如 underscore.js)都遵循 commonjs 标准,因此您可以使用require("views/lib/[your module name]")在视图中使用它们。

假设您在视图中的 lib 对象中包含 underscore.js 作为“下划线”,如下所示:

views: {
    lib: {
         underscore: "// Underscore.js 1.1.6\n ...
    }
    ...
    [ the rest of your views go here]
}

,然后您可以将以下内容添加到您的视图中以访问 _ 模块:

var _ = require("views/lib/underscore");

对于自定义库,您需要做的就是将您想要在库中共享的任何内容设置为全局“导出”对象的值。

于 2011-10-11T14:51:11.417 回答
8

来自CouchDB 维基

没有在视图之间共享代码/功能的开发计划。每个视图函数都根据其字节表示的散列进行存储,因此函数不加载任何附加代码、在不更改其字节字符串的情况下更改其行为是很重要的。因此是CouchApp的用例。

于 2009-07-29T01:38:05.957 回答
3

答案在于couchapp。使用 couchapp,您可以将包含通用库代码的宏嵌入到任何设计文档部分。它在设计文档提交到服务器之前完成。您需要做的查询是反转发出的键,以便您可以在“网络”上进行范围查询

function(doc) 
{
  if (doc.type == 'person') 
  {
    emit([doc.net_worth, doc.lastname], null);
  }
}

您不想include_docs=true在查询参数中包含可以执行此操作的文档。您可以免费获得 doc.id 作为密钥的一部分。现在您可以对 networth 进行范围查询,看起来像这样。

http://localhost:5984/database/_design/people/_view/by_net_worth?startkey=[1000000]&endkey=[{},{}]&include_docs=true
于 2010-04-20T04:00:34.657 回答
1

Couchapp 将在库中“宏”,并且运行良好。

另一个不受支持的选项是将类似的实用程序功能添加到自定义查询服务器。js文件没那么难懂,Ruby和Python版本就更简单了。视图服务器将设计文档中的字符串在执行时编译为函数对象,因此如果您通过实用程序函数、常量或其他内容关闭这些函数,它们将可以在 map/reduce/show/list 函数中执行。

在 main.js 文件中查找定义“emit”和“log”的位置,并模拟这些函数的定义以将您的自定义实用程序函数公开给您的地图并减少 lambda。

警告:更改视图服务器而不需要重建视图将意味着您的视图索引将不正确。程序员当心。

于 2010-07-13T03:17:48.833 回答
-2

您不能这样做(我上次检查过),因为视图存储在数据库中,并且视图的键是其自身的哈希值。视图不能依赖外部数据/逻辑/编程,因为如果它发生变化,那么视图就会不同并且不会匹配。它让我感到困惑,现在仍然如此,所以我可能是错的。

于 2009-07-29T01:26:20.917 回答