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-フィルターのフィルター:

「これは金持ちですか?」でフィルタリングする1つのビューが必要な場合はどうなりますか?

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

もう1つは、名前でインデックスを作成します。

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

どうすればドライヤーになれますか?

4

5 に答える 5

23

このブログ投稿によると、viewsオブジェクトにlibというキーを設定することで、couchdb 1.1のビューのmap関数(reduce関数ではない)にcommonjsモジュールを追加できます。underscore.jsのような人気のあるJavaScriptライブラリの多くはcommonjs標準に準拠しているため、require( "views / lib / [your module name]")を使用してビューで使用できます。

次のように、ビューのlibオブジェクトに「underscore」として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 Wikiから:

ビュー間でコード/関数を共有する開発計画はありません。各ビュー関数は、バイト表現のハッシュに従って格納されるため、関数が追加のコードをロードせず、バイト文字列を変更せずに動作を変更しないことが重要です。したがって、 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を無料で入手できます。これで、純資産に対して範囲クエリを実行できます。これは次のようになります。

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

Couchappはライブラリで「マクロ」になり、かなりうまく機能します。

サポートされていないもう1つのオプションは、そのようなユーティリティ関数をカスタムクエリサーバーに追加することです。JSファイルはそれほど難しくなく、RubyとPythonのバージョンはさらに単純です。ビューサーバーは、実行時にデザインドキュメント内の文字列を関数オブジェクトにコンパイルするため、ユーティリティ関数や定数などでこれらの関数を閉じると、map / reduce / show/list関数で実行可能になります。

main.jsファイルで「emit」と「log」が定義されている場所を探し、これらの関数の定義をエミュレートして、カスタムユーティリティ関数をマップに公開し、ラムダを減らします。

警告:ビューの再構築を必要とせずにビューサーバーを変更すると、ビューインデックスが正しくないことを意味します。プログラマーは注意してください。

于 2010-07-13T03:17:48.833 に答える
-2

ビューはデータベースに保存されており、ビューのキーはそれ自体のハッシュであるため、これを行うことはできません(最後に確認しました)。ビューが変更されるとビューが異なり、一致しないため、ビューは外部のデータ/ロジック/プログラミングに依存できません。それは私を混乱させました、そして今でもそうです、それで私は間違っているかもしれません。

于 2009-07-29T01:26:20.917 に答える