1

Apache CouchDB で非常に単純なユーザー システムを構築しています。メールでユーザーを検索するための簡単なビューを作成しました。

by_email
map
function(doc) {
 if (doc.kind == "user" && doc.email) emit(doc.email, doc.name);
 }

これは戻ります

 {"id"=>"00006a80-723b-012f-6b38-1040f398478e", "key"=>"spiderman@spiderman.ai", "value"=>"Spiderman"}

今、私は非常にばかげた何かを見落としているかもしれません (もしそうなら、私は謝罪します) しかし、なぜこのビューから 2 つのフィールド (ID を数えれば 3 つ) しか取得できないのでしょうか?

通常の状況と同様に、電子メールまたはユーザー ID から開始してユーザー データベースを検索し、完全なドキュメントを取得することができます。

今、私はhttp://guide.couchdb.org/draft/cookbook.html (キーで検索) の例を読みました。特定の年齢のユーザーの名前だけです。

これがどのように適切に使用されるのか理解できません。クライアント、サプライヤーのデータベースにクエリを実行すると、1つまたは2つの値だけでなく、完全なドキュメントが返されます。

だから私の解決策は別の見方でした:

mailplus
map
function(doc) { if (doc.kind == "user" && doc.email)  emit(doc.email,doc) }

そのため、メールだけでなくドキュメント全体も値として返します。これは機能しますが、ご想像のとおり、大規模なデータベースではかなり遅くなります。

問題は、単純なクエリを実行して、たとえば CouchDB - NoSQL を使用して電子メールで検索しているユーザーに関する完全な詳細を取得するより良い方法はありますか?

「NoSQLでSQLを考えることはできないので、これは間違っている」と答えたくなる誘惑があることは知っていますが、待ってください。実際のアプリケーションでは、テーブル/行などではなくドキュメントの観点からNoSQLとして考えると、完全なドキュメントが必要になる場合があります。ユーザーのために。クライアントの詳細を取得する単純なシステムがあるとします。完全な文書が必要です。最初にキー、電子メールを提供する場合にのみ、ID とキーを知る必要はありません。

4

3 に答える 3

3

私がcouchdbを使用してからしばらく経ちましたが、これはまだ正確だと思います。

これらの 2 つのフィールドのみを取得できます。ビューに入れるのはそれだけだからです。内部的に、couchdb は、発行された各キー/値に対応するドキュメントの ID を追跡します。次に、そのビューにクエリを実行するときにオプションを使用しinclude_docsて、couchdb に ID でドキュメントを検索させることができます ( docsを参照) 。

概説したもう1つの選択肢は、ドキュメント全体を表示することです。これにより、インデックスがはるかに大きくなります

于 2012-04-29T19:49:06.543 に答える
2

ドキュメントを発行する必要はありません。include_docs=trueクエリパラメータに追加するだけです。完全なドキュメントはwiki1にあります

于 2012-04-30T06:26:16.800 に答える
1

また、emit(doc.email, {name: doc.name, age: doc.age}) を使用してドキュメントの一部を発行することもできます。

于 2012-04-30T07:45:12.067 に答える