0

CouchDB の次のドキュメントを考えると....

{
   "_id": "002bafd55b353692a7ab2968074310cc2cbff258",
   "_rev": "1-bc853056ac61d817ae3c4ecb4f81322b",
   "names": [
     { "locale": "en", "value": "Example"  },
     { "locale": "de", "value": "Beispiel" },
     { "locale": "fr", "value": "Exemple"  }
   ],
   "details": [
     { "locale": "en", "value": "An Example is here" },
     { "locale": "de", "value": "Ein Beispiel ist heir" }
     { "locale": "en", "value": "Un exemple est ici" }
   ]
}

...不要な言語が除外された部分的なドキュメントを返すことができるビューを作成するにはどうすればよいですか?

  • curl ..snip.. '_design/locale_filter/?locale=en,de,fr,it'
  • curl ..snip.. '_design/locale_filter/?locale=en,fr'
  • curl ..snip.. '_design/locale_filter/?locale=en'

次のようなものを返す必要があります。

{
   "_id": "002bafd55b353692a7ab2968074310cc2cbff258",
   "_rev": "1-bc853056ac61d817ae3c4ecb4f81322b",
   "names": [
     { "locale": "en", "value": "Example"  },
   ],
   "details": [
     { "locale": "en", "value": "An Example is here" },
   ]
}

ドキュメントがさらに深い構造を持ち、名前詳細構造を繰り返すサブケースもあります。これらも理想的な世界ではフィルタリングされます。

{
   "_id": "002bafd55b353692a7ab2968074310cc2cbff258",
   "_rev": "1-bc853056ac61d817ae3c4ecb4f81322b",
   "names": [ ... snip ... ],
   "details": [ ... snip ... ]
   "deeper": {
      "names": [
         { "locale": "en", "value": "Sub-Example"  },
      ],
      "details": [
         { "locale": "en", "value": "The Sub-Example is here" },
    }
}

また、これはビューではなく、むしろショーである可能性があることにも注意してください。

初心者からの最後の質問は、couchdb ビューとデザイン ドキュメントでの作業を簡単にする方法があるかどうかです。現在、 ericaを試しています。これはやり過ぎのように感じます。ソファ アプリは必要ないと確信しているからです。 、ディスク上のファイルでビューを簡単に維持し、重要な変更を加えるたびにソファデータベースと同期したいだけです。

4

1 に答える 1

0

私はshow関数を使用してこれを実装することができました。2つのshow関数を実装しました。1つは便宜上です。

(doc, req) ->
  all_locales = []
  for name in doc.names
    all_locales.push name.locale
  toJSON(all_locales)

(私もそれを実装detailsし、実際のコードで重複するロケールを削除しました)

これにより、次のことが可能になります。

GET /_design/dbname/_show/list_locales/c0db9ad..snip..

["en", "de", "fr"]そして、たとえば、言語がたまたま持っているロケールが何であれ、を返します。

次に、フィルタリングされたドキュメントを取得する関数をフォローアップできます。

(doc, req) ->
  locales = req.query.locales.split(",")
  doc.names = doc.names.filter (name) ->
    locales.indexOf(name.locale) > -1
  doc.overviews = doc.details.filter (overview) ->
    locales.indexOf(overview.locale) > -1
  return toJSON(doc) + "\n"

この使用パターンは次のとおりです。

GET /_design/dbname/_show/restrict_locales/c0db9ad..snip..?locales=en,fr
GET /_design/dbname/_show/restrict_locales/c0db9ad..snip..?locales=fr
GET /_design/dbname/_show/restrict_locales/c0db9ad..snip..?locales=en,fr,de,it,hu,zh

それは非常にうまく機能し、私が予想していたよりもはるかに高速でした。show関数の結果はCouchDBによって積極的にキャッシュされていると思います。

于 2012-12-13T13:43:18.590 に答える