Javascript 我该如何消除我的CouchDB观点?

Javascript 我该如何消除我的CouchDB观点?,javascript,couchdb,dry,Javascript,Couchdb,Dry,如何在CouchDB中的视图之间共享代码 示例1——实用方法 杰西·哈利特,包括 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]); }

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

示例1——实用方法 杰西·哈利特,包括

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;
};

...
示例3——过滤器的过滤器: 如果我想要一个按“这是富人吗?”过滤的单一视图,该怎么办

还有一个是按姓氏索引的:

function(doc) {
  if (doc.last_name) {
    emit(doc.last_name, doc);
  }
}
我如何才能将它们组合成“按姓氏排列的富人”视图

我有点想要红宝石的那种

my_array.select { |x| x.person? }.select { |x| x.net_worth > 1,000,000 }.map { |x| [x.last_name, x] }
我怎样才能更干爽?

您不能这样做(上次我检查时),因为视图存储在数据库中,视图的键本身就是一个散列。视图不能依赖外部数据/逻辑/编程,因为如果它发生更改,则视图将不同,并且不匹配。它让我困惑,现在仍然如此,所以我可能是错的。

来自:

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

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

您不想包含文档,您可以在查询参数上使用
include\u docs=true
来实现。您可以免费获得doc.id作为密钥的一部分。现在,您可以在networth上执行范围查询,该查询类似于以下内容

http://localhost:5984/database/_design/people/_view/by_net_worth?startkey=[1000000]&endkey=[{},{}]&include_docs=true
Couchapp将在库中使用“宏”,并且它工作得非常好

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

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

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

根据,您可以在couchdb 1.1的视图中添加一个名为lib的键,将commonjs模块添加到映射函数(但不是reduce函数)。许多流行的javascript库(如underline.js)都遵循commonjs标准,因此您可以使用require(“views/lib/[your module name]”)在视图中使用它们

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

views: {
    lib: {
         underscore: "// Underscore.js 1.1.6\n ...
    }
    ...
    [ the rest of your views go here]
}
,然后可以将以下内容添加到视图中,以访问uu模块:

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

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

显然“没有在视图之间共享代码/函数的开发计划”。请参阅,但这并不能回答我关于过滤器过滤器或过滤器映射的问题,由于couchdb必须在视图更改时更新索引,因此需要知道视图何时更改。如果您依赖视图中的外部库或代码,那么视图可以在couchdb不知情的情况下更改。这将导致索引过时,并且可能不正确。也就是说,从理论上讲,您可以创建自己的javascript视图服务器,将这些库与上面提到的警告和风险捆绑在一起答案应该是这个信息是正确的,但在我们的时代它似乎已经过时了。@Antonio您能提供一些关于如何使用当前CouchDB rel进行此操作的参考资料吗?(即:1.6或更高?)
http://localhost:5984/database/_design/people/_view/by_net_worth?startkey=[1000000]&endkey=[{},{}]&include_docs=true
views: {
    lib: {
         underscore: "// Underscore.js 1.1.6\n ...
    }
    ...
    [ the rest of your views go here]
}
var _ = require("views/lib/underscore");