如何在CouchDB中的视图之间共享代码?
Jesse Hallett has some good utility methods,包括
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;
};
...
我可以在哪里放置此代码,以便每个视图都可以访问它?
类似于我在我的应用程序中使用的常量。我在哪里
MyApp = {
A_CONSTANT = "...";
ANOTHER_CONSTANT = "...";
};
如果我想要一个过滤“这是一个富人吗?”的视图怎么办?
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] }
我怎样才能干嘛?
答案 0 :(得分:23)
根据this blog post,您可以通过在视图对象中使用名为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]
}
,然后您可以将以下内容添加到视图中以访问_ module:
var _ = require("views/lib/underscore");
对于自定义库,您需要做的就是将要在库中共享的任何内容作为全局“exports”对象的值。
答案 1 :(得分:8)
来自CouchDB Wiki:
没有开发计划在视图之间共享代码/功能。每个视图函数都是根据其字节表示的哈希值存储的,因此重要的是函数不会加载任何其他代码,在不更改其字节字符串的情况下更改其行为。因此CouchApp的用例。
答案 2 :(得分: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
答案 3 :(得分:1)
Couchapp将在图书馆中“宏观”,而且效果非常好。
另一个不支持的选项是将这样的实用程序功能添加到自定义查询服务器。 JS文件并不难理解,Ruby和Python版本更简单。视图服务器在执行时将设计文档中的字符串编译为函数对象,因此如果您通过实用函数,常量或其他函数关闭这些函数,它们将在map / reduce / show / list函数中执行。
在main.js文件中查找定义“emit”和“log”的位置,并模拟这些函数的定义,以便将自定义实用程序函数公开给地图并减少lambdas。
警告:更改视图服务器而不需要在视图上进行重建将意味着您的视图索引将不正确。程序员要小心。
答案 4 :(得分:-2)
你不能这样做(我最后检查过),因为视图存储在数据库中,视图的键是它自己的哈希值。视图不能依赖外部数据/逻辑/编程,因为如果它发生变化,那么视图就会不同并且不匹配。它使我困惑,但仍然如此,所以我可能错了。