3

連絡先管理アプリでは、各ユーザーが独自のデータベースを持ちます。ユーザーが特定のカテゴリの連絡先を他のユーザーと共有したい場合、バックエンドがレプリケーションを開始します。各連絡先は独自のドキュメントですが、メモや予定などのさまざまな子ドキュメントもあります。

ここに例があります...

コンタクト:

{
  "_id": 123,
  "type": "contact",
  "owner": "jimmy",
  "category": "customer",
  "name": "Bob Jones",
  "email": "bob@example.com"
}

ノート:

{
  "_id": 456,
  "type": "note",
  "owner": "jimmy",
  "contact_id": 123,
  "timestamp": 1383919278,
  "content": "This is a note about Bob Jones"
}

たとえば、Jimmy が自分の唯一の顧客をセールス マネージャーの Kevin と共有し、個人の連絡先は非公開にしたいとします。メモがレプリケーション フィルターを通過すると、リンクされた連絡先のカテゴリ フィールドにアクセスできますか?

または、連絡先のすべての子でカテゴリ フィールドを複製する必要がありますか? 各連絡先には、カテゴリが変更されるたびに手動で更新する必要がある多くの子が含まれている可能性があるため、これを行う必要はありません。

フィルター関数の擬似コードを次に示します。

function(doc, req)
{
  if(doc.type == “contact”) {
    if(doc.category == req.query.category) {
      return true;
    }
  }
  else if(doc.contact_id) {
    if(doc.contact.category == req.query.category) {
      return true;
    }  
  }
  return false;
}

可能であれば、その方法を説明してください。ありがとう!

4

2 に答える 2

1

他にもいくつかのオプションがあります。

CouchDBにはあまり知られていない JOIN トリックがあります。ただし、レプリケーションを使用する代わりに、MapReduce ビューの結果を共有する必要があります。残念ながら、ビューをレプリケーションのフィルターとして使用できます。Cloudant を使用している場合 (免責事項: 私は Cloudant に雇われています)、chained-MapReduce を使用して結果を別のデータベースに出力し、そこから複製することができます...

さらに、ドキュメント構造に関するこの SO 投稿/回答と、この結合トリックが役立つと思います:ドキュメント間で CouchDB の関係をモデル化しますか?

于 2013-11-13T00:01:21.950 に答える
0

いいえ、これは不可能です。各ドキュメントは、他のドキュメントとの明示的な関係を持たないように一貫性がなければなりません。参照としての値を持つcontact_idことは、あなたの側の合意にすぎません - CouchDB はこれを認識していません。

このようなトリックを行うには、文字通り、カテゴリ ドキュメントを連絡先 1 内にネストする必要があります。たとえば、フィルタ関数で処理するドキュメントを 1 つにする必要があります。これは、連絡先ドキュメントの一貫した状態が必要な場合に適したソリューションです。

于 2013-11-08T15:23:15.830 に答える