0

いくつかの値をフェッチする必要があるデータベースがあります。データベースは、部屋を含むドキュメントで構成され、各部屋には「floor」と「hotel」のプロパティがあります(さらにいくつかありますが、ここでは重要ではありません)。

事はです; 私が求めるホテルのすべてのフロアを取得する必要があります。getAllFloorsOnHotel("hotel")ちょっとしたこと。しかし、データベースをクエリする方法がわかりません。私はここを読みました:http://guide.couchdb.org/editions/1/en/cookbook.html#unique、しかしそれは私が必要としているものではありません。そこで彼らはキーを一緒に使用してgroup=true重複を削除します。これは床がキーである場合に機能しますが、私の場合はホテルがキーです。したがって、私が使用する場合、私group=trueは当然そのホテルの後ろに1階しかありません。を使用しない場合group=true、指定されたホテルのすべてのフロアが重複して返されます。

couchdbでホテルのすべてのフロアを重複せずに戻すにはどうすればよいですか?

4

1 に答える 1

2

キーには配列を使用する必要があります。

マップ関数では、エミットは次のようになります。

emit([doc.hotel, doc.floor], null);

値に null を入れましたが、reduce 関数に使用したいものなら何でもかまいません。すべてのホテルのすべてのフロアのリストを取得するには、reduce 関数で true を返すだけです。

次に、クエリを実行するときに、 group の代わりに group_level を使用し、グループ化する配列のレベルに割り当てます。group_level=2 はフロアごとにグループ化します。

部屋をcurlでクエリするには、次のようにします。

curl -X GET http://localhost:5894/yourDB/yourView?group_level=2

これにより、すべてのホテルとそのすべてのフロアが表示されます。特定のホテルのリストを取得するには、範囲を照会する必要があります。curl を使用してこれを行う方法を示すのは困難です。これを機能させるには、配列文字列に対してあらゆる種類の操作を行う必要があるためです。必要な変数は startkey と endkey です。とにかく ajax を使用している可能性があるため、これらをオプションとして渡すだけです。

startkey: ["hotelName", 0],
endkey: ["hotelName", {}],
group_level: 2

0 と {} は単に低い値と高い値です。{} は最後にソートされるため、文字列が何であれ、これら 2 つの間のものになります。

また、decending: true を使用する場合は、0 と {} を入れ替える必要があります。(それは私に多くの苦痛を与えました)

ここにいくつかの詳細情報があります: 同じビューでの CouchDB の並べ替えとフィルタリング

于 2013-02-21T11:19:47.393 に答える