0

Couchbase Server 3.0 では、バケット内のドキュメントは次の形式です。

{ "id":"xyz", "categories":["news", "articles", "etc.etc.."]}

key="news" を指定すると、"categories" 配列属性に "news" を含むすべてのドキュメントが返されるようなビューを作成したいと考えています。

「categories」配列の要素の数だけ同じ記事を発行するマップ関数を作成するところまで行きました。

function (doc, meta) {
  for(var i = 0; i < doc.categories.length ; i++)
  emit(doc.categories[i], doc);
}

しかし、私は削減にこだわっています。

4

2 に答える 2

0

map 関数で十分であることがわかりました。URL で key="cateogoryName" を使用してクエリを実行するだけで済みました。

クエリでキーを引用符で囲まないと、非常に不思議なエラーが発生するため、最初は混乱しました。https://issues.couchbase.com/browse/MB-7555を参照してください

reduce 関数がより効率的かどうかはわかりませんが..

于 2015-06-14T16:45:16.130 に答える
0

データを照会するだけの場合は、reduce 関数は必要ありません。つまり、空のままにしておくことができます。結果セットに対して計算を実行するには、reduce のみが必要です。

以下も参照してください。

http://docs.couchbase.com/developer/dev-guide-3.0/built-in-reduce.html

ただし、マップを次のように変更する場合があります。

function (doc, meta) {
  if (doc.categories) {
    for(var i = 0; i < doc.categories.length ; i++) {
      emit(doc.categories[i], null);
    }
  }
}

if ステートメントでタイプを確認することもできます。reduce 関数がないため、2 番目のパラメーターとして null を発行できます。これは、たとえば次のように Java で照会できます (非同期)。

bucket.async()
      .query(query)
      .flatMap(AsyncViewResult::rows)
      .flatMap(AsyncViewRow::document)
      ...
于 2015-06-14T16:45:40.980 に答える