簡體   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