繁体   English   中英

如何干掉CouchDB视图?

[英]How do I DRY up my CouchDB views?

如何在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] }

我怎么能干嘛?

根据这篇博文 ,你可以通过在views对象中使用一个名为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");

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

来自CouchDB Wiki

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

答案在于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

Couchapp将在图书馆中“宏观”,而且效果非常好。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM