0

私はソファデータベースを備えた単純なデータベースを持っています。私はユーザーにそのフィールドを持っています:

String userName
String password
String mail
boolean admin

ユーザーをdbに保ちます。ただし、Couch DB と NoSql は初めてです。例を使用して map reduce を実装するにはどうすればよいですか (または、内部的に実行し、何もする必要はありませんか?)

アプリケーションには Spring 3 と Ekorp を使用しています。

4

2 に答える 2

1

あなたの質問はもう少し詳細を使用できますが、私が理解しているように、ユーザーの「テーブル」のように機能する Couch DB ドキュメントを作成したいと考えています。そのためには、次のプロパティを使用して Couch DB に JSON ドキュメントを作成する必要があります。

{
    type: "user",
    username: "John",
    password: "*****",
    mail: "blah, blah, blah",
    admin: true
}

上でルークキャンベルが指摘したように、各エンティティを識別するために独自の「タイプ」プロパティを作成する必要があります...たとえば、管理プロパティを使用して権限を持つユーザーを識別するのではなく、「タイプ」プロパティを変更するだけです:

{
    type: "admin"...
}

データベースにクエリを実行し、特定のドキュメントを取得するには、map 関数を使用する必要があります。繰り返しになりますが、lukecampbell の例は良い出発点を提供します。

function(doc){
    if(doc.type == "user"){ 
        emit(doc.name, doc);
    }
}

この「クエリ」は、「doc.name」順に並べられたすべての「ユーザー」エンティティ ドキュメントの「ビュー」を提供します。ここで Couch DB の利点が明らかになります... Map (および reduce) 関数は、ある意味では SQL クエリに似ています... しかし、それらは JavaScript で記述されているため、JavaScript ロジックを使用してデータベースを形成できます。

function(doc){
     if(doc.type == "user" && doc.name == "John"){ 
         emit(doc.name, doc);
     }
}

これにより、ユーザー名が John であるすべての「ユーザー」ドキュメントが表示されます。おわかりのように、場合によっては、この方法でクエリを作成すると、SQL よりもはるかに表現力が高くなる可能性があります。

function(doc){
    if(
        doc.type == "user" && 
        typeof doc.admin == "boolean"
    ){ 
        emit(doc.name, "Is Admin?: " + JSON.stringify(doc.admin);
    }
}

この「クエリ」は、各「ユーザー」の名前と小さなステータス メッセージ (「Is Admin?: true (or false)」) を、admin プロパティのブール値を持つすべてのユーザー ドキュメントに対して出力する必要があります。「Reduce」関数に関しては、それらは非常に便利ですが、最初に map 関数を完全に理解することがはるかに重要です。なぜなら、それらは非常に用途が広く、ほとんどの場合、適切に作成された map 関数は「reduce」関数を作成する必要をなくすからです。 ...

Couch DB には多くの可能性があります。このサイトはおそらく開始するのに最適な場所です。http://guide.couchdb.org/index.html - とはいえ、テクノロジーには非常に奇妙な癖があり、データベースの設計を再考せざるを得ないことがあります... これらの癖の 1 つは、ここで簡単に説明されています (ビクター・ニコレットの答え):

null 値で Couch DB ビューを作成することに問題はありますか?

于 2012-08-21T09:42:47.160 に答える
0

ソファで、ドキュメントにフィールドを追加します

_タイプ

また

タイプ_

マップ機能は

function(doc) {
 if(doc.type_=="user") { 
   emit(doc.name,doc._id);
 }
}
于 2012-02-03T21:48:24.793 に答える