2012-01-27 7 views
5

私は一般的にCouchDBとドキュメント指向のデータベースが初めてです。CouchDBでの重複の特定

私はCouchDBを使いこなしていて、ドキュメントの作成(perl)とFutonのMap/Reduce関数を使用してデータをクエリし、ビューを作成することに慣れてきました。

私がまだ解明しようとしていることの1つは、FutonのMap/Reduceを使用してドキュメント間で重複する値を識別する方法です。例えば

私は次の書類があれば、:

{ 
    "_id": "123", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:06:03Z" 
} 

{ 
    "_id": "124", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:07:03Z" 
} 

を私は「名前」の値が重複していた文書IDのリストを取得したい、これは私が布団地図で行うことができますものです/減らす?次のように結果を達成するために期待していた

は次のとおりです。

値、およびそれらの重複する値が含まれている関連する文書IDになり
{ 
    "name": "carl", 
    "dupes": [ "123", "124" ] 
} 

..or ..

{ 
    "carl": [ "123", "124" ] 
} 

.. 。

Map/Reduceでいくつかのことを試しましたが、わかっている限り、マップ機能はドキュメントごとのデータで動作し、Reduce機能ではキー/指定されたドキュメントの値。

私はperlで必要なデータを取り込み、そこで魔法を働かせて、私が望む結果を得ることができると知っていますが、私はCouchDBだけでそれをもっと良く理解するために働いています。私が当初考えていたように、マップ/削減機能を使用できるようにする必要があり

{ 
    "_id": "names", 
    "rec1": { 
    "_id": "123", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:06:03Z" 
    }, 
    "rec2": { 
    "_id": "124", 
    "name": "carl", 
    "timestamp": "2012-01-27T17:07:03Z" 
    } 
} 

..:

私はこれをやって考えているもう一つの方法は、RDBMSのテーブルのように単一のドキュメントを使用することです。しかし、これが理想的かどうかは分かりません。

私はまだ自分の心がRDBMSの土地に詰まっていることを理解していますので、私が上にしようとしていることの多くは必要ではないかもしれません。これについての洞察は非常に高く評価されます。

ありがとうございます!

編集:一部の例でJSON構文が修正されました。

答えて

7

一意の値の一覧が必要な場合は、かなり簡単です。重複を識別したい場合は、それほど簡単ではありません。どちらの場合も

は、このようなマップ機能で十分です:

function (doc) { 
    emit(doc.name); 
} 

をご軽減機能のために、ちょうど_countを入力してください。

あなたのビューの出力は次のようになります。(あなたの2つの文書に基づいて)

{ 
    "rows": [ 
     { "key": "carl", "value": 2 } 
    ] 
} 

そこから、あなたは、名前のリストだけでなく、その周波数を持つことになります。あなたはそのリストを取ってそれを自分でフィルタリングするか、 "all couch"ルートを使って_list functionを使って最終的なフィルタリングを実行することができます。

function (head, req) { 
    var row, duplicates = []; 
    while (row = getRow()) { 
     if (row.value > 1) { 
      duplicates.push(row); 
     } 
    } 
    send(JSON.stringify(duplicates)); 
} 

_listの機能を読み、それはかなり便利で多才なものです。

+0

...と重複IDを取得する:?skip = 1&reduce = false&key = "car1" –

関連する問題