2010-12-13 4 views
1

これは私の最初の質問stackoverflowのため、私は正しいプロトコルに従っていることを願っています。共通鍵でCouchDB文書を注文できますか?

私はCouchDBとNodeJSに基づいて基本的なブラウザゲームを作成しています。私のゲームでは、ユーザーは複数の文字を持つことができます。私はデータベース内のキャラクターとプレイヤーを分けることに決めました。なぜなら、ユーザーアカウントデータ(電子メール、実名など)をキャラクターデータに関連付けることはめったにないからです。とにかく、ここに私の問題があります:

私は、プレイヤーによって制御されているすべての文字を返すビューを作成したいと考えています。このドキュメントには「所有者」というプロパティがあります。これを行う最も簡単な方法は、所有者によって分類されたすべての文字のリストを返すビューを作成することです。

ここに私のコードは、これまでのところです:

機能(DOC){ EMIT(doc.owner、DOC); }

私はこのような結果を取得しようとしている(注、これが簡略化され、私は、CouchDBの出力内の他のデータが含まれて知っている):

{ 
    "player1":{ 
     "character1":{ 
      "data":{} 
     }, 
     "character2":{ 
      "data":{} 
     } 
    }, 
    "player2":{ 
     "character1":{ 
      "data":{} 
     }, 
     "character2":{ 
      "data":{} 
     } 
    } 
} 

は、キーは一意である必要がありますか?私のコードは私に望ましい結果を与えるでしょうか?

私はデータを分けることには結婚していません。代わりに、ユーザー文書の下に文字を置き、ちょうどユーザーアカウントデータを出す文字データと、もう一つは文字データだけを出力し、ユーザデータは省略しますが、それは私には少し厄介なようです。キャラクターデータに特有の他のビューを書く必要があるかもしれないので、データを別にしておきたいのですが、データベース内のプレーヤーからキャラクターを分離すれば、より整理されたように思えます。

関連するメモでは、2番目のパラメータを渡すことで応答をフィルタリングする方法はありますか?私はこれがビューの効率を否定し、おそらくこのインスタンスでは一時的なビューを使用すべきだと考えています。私の問題は、このビュー(実際にはデータベース全体)によって大量のデータが返される可能性があることです。特に、ほとんどのデータが必要ないため、HTTP経由で転送すると非常に遅くなる可能性があります。

解決策のもう1つの可能性は、ユーザーが制御する各文字の_idをプロパティとしてユーザーアカウントデータベースに格納することです。これは私には十分分かりやすいようですが、異なる、またはあえて "より良い"オプションがあるとすれば、それを聞いてみたいと思います。

この問題を解決するにはどうすればよいでしょうか?

ご協力いただきありがとうございます。

+0

あなたの最初の質問と今あなたは10k +です:) ... – TimoSolo

答えて

4

あなたは正しい道を歩いています。これは、あなたが尋ね直接返しますが、ほとんどが最適である必要があります

function(k,v,red) { 
    var r = {}; 
    for (var i in v) { 
    for (var owner in v[i]) { 
     if (!(owner in r)) r[owner] = {}; 
     for (var character in v[i][owner]) 
     r[owner][character] = v[i][owner][character]; 
    } 
    } 
    return r; 
} 

を:ビュー

function(doc) { 
    var r = {}, c = {}; 
    c[doc._id] = doc; 
    r[doc.owner] = c; 
    emit(doc.owner,r); 
} 

をそして、これは削減:あなたは削減でこれを行いたい場合は、この地図を定義することができますMapとReduceの両方のデータをたくさん保存しなければならない...

代わりに、私はこのように、削減せずに地図のために行くだろう:

[ 
    { id : 'charid', key : 'playid', doc : { /* character document */ } }, 
    ... 
] 

サーバー:include_docs=trueを照会する場合、このような行を返す、

function(doc) { 
    emit(doc.owner,null); 
} 

このマップロードが軽くて、結果的にkeyを使用して、プレイヤーが文字を再編成することができます。結果はkey、次にidでソートされます。

startkeyendkeyを使用してこのビューを照会すると、プレーヤー識別子と同じで、プレーヤーが持つすべての文字を取得できます。文字識別子のみが必要な場合は、include_docs=falseを追加し、重いdoc部分は送信されません。

+0

私は両方のソリューションのためのドキュメントデザインを作成し、両方を試してみて、どちらがよかったかを見てみましょう。本当にありがとう!! – tjameson

関連する問題