2

couchdbにドキュメントがあります。スキーマは次のようになります。

userId
email
personal_blog_url
telephone

2人のユーザーは、実際には同じ人物であると思います。

  • メールまたは
  • personal_blog_urlまたは
  • 電話

同一である。

3つのビューを作成しました。これは、基本的にemail / blog_url / telephoneをuserIdsにマップし、userIdsを同じキーの下のグループに結合します。

_view/by_email:
----------------------------------
key                   values     
a_email@gmail.com    [123, 345]
b_email@gmail.com    [23, 45, 333]

_view/by_blog_url:
----------------------------------
key                   values     
http://myblog.com    [23, 45]
http://mysite.com/ss [2, 123, 345]

_view/by_telephone:
----------------------------------
key                   values     
232-932-9088          [2, 123]
000-111-9999          [45, 1234]
999-999-0000          [1]

私の質問:

  • 3つの異なるビューの結果を、重複を含まない最終的なユーザーテーブル/ビューにマージするにはどうすればよいですか?
  • または、couchdbでそのような重複排除を行うのが良い習慣かどうか。
  • または、ソファで重複排除を行うための良い方法は何でしょうか?

ps。最終ビューでは、すべての重複について、最小のuserIdのみを保持するとします。

ありがとう。

4

2 に答える 2

2

良い質問。おそらく_changes、提案したビューで実際のユーザーに固有にしたいフィールドを聞いて検索することができます(by_*)。

  • ビューを1つにマージします(1つのマップで異なるフィールドを出力します)。

    function(doc){if(!doc.email ||!doc.personal_blog_url ||!doc.telephone)return; 放出([1、doc.email]、[doc._id]); 放出([2、doc.personal_blog_url]、[doc._id]); 放出([3、doc.telephone]、[doc._id]); }

  • 削減でIDのリストをマージします

  • 変更フィードの新しいドキュメントが到着したら、ビューをクエリkeys=[[1, email], [2, personal_blog_url], ...]して3つのリストをマージできます。最小IDが変更されたドキュメントよりも小さい場合は、フィールドrealIdを更新します。そうでない場合は、リスト内のドキュメントを変更されたIDで更新します。

{ userId, realId }別のドキュメントを使用してリレーションを保存することをお勧めします。

于 2012-10-22T22:39:23.997 に答える
1

ビューを使用するだけでは、新しいドキュメントを作成することはできません。実際のマージを行うには、ある種のタスクが必要になります。

ここに1つのアイデアがあります。

3つのビューを作成する代わりに、1つのビュー(データが存在する場合はデータにインデックスを付ける)を作成できます。

Key                             Values
---                             ------
[userId, 'phone']               777-555-1212
[userId, 'email']               username@example.com
[userId, 'url']                 favorite.url.example.com

データの不要な重複が大量に発生するため、生の値以外は何も保存しません(たとえば、オブジェクト全体を保存した場合)。

次に、クエリを実行するには、次のようにします。

...startkey=[userId]&endkey=[userId,{}]

これにより、重複するすべての情報が、そのユーザーIDの一連のドキュメントとして提供されます。重複があったかどうかを確認するには、それを個別に解析する必要があります。ただし、この方法では、結果が1つのCouchDB呼び出しにうまくマージされます。

StackOverflowで配列をキーとして使用する良い例を次に示します

重複排除プロセスの一部ではない他のデータが含まれている場合は、元の「ユーザー」ドキュメントをロードする可能性があります。

発見されたら、その場でデータをクリーンアップし、新しいデータがアプリケーションに入力されたときに新しい重複が発生しないようにすることを検討できます。

于 2012-10-22T19:15:01.993 に答える