6

私は一般的に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"
}

そして、重複した「name」値を持つドキュメントIDのリストを取得したかったのですが、これはFuton Map / Reduceで実行できることですか?

達成したいと思っていた結果は次のとおりです。

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

..また..

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

..これは値であり、それらの重複する値を含む関連するドキュメントIDです。

Map / Reduceでいくつかの異なることを試しましたが、私が理解している限り、Map関数はドキュメントごとにデータを処理し、Reduce関数では特定のキー/値のみを操作できます。資料。

私はperlで必要なデータを取得し、そこで魔法を使って、必要な結果を得ることができることを知っていますが、CouchDBの利点/制限をよりよく理解するために、今のところCouchDBのみで作業しようとしています。

これを行うことを考えているもう1つの方法は、RDBMSテーブルのような単一のドキュメントを使用することです。

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

..これにより、Map/Reduce関数を当初考えていた方法で使用できるようになります。しかし、これが理想的かどうかはわかりません。

私の心はまだRDBMSの土地にとどまっていることを理解しているので、上記でやろうとしていることの多くは必要ないかもしれません。これに関する洞察をいただければ幸いです。

ありがとう!

編集:いくつかの例のJSON構文を修正しました。

4

1 に答える 1

7

一意の値のリストだけが必要な場合は、非常に簡単です。重複を特定したい場合は、それほど簡単ではありません。

どちらの場合も、次のようなマップ関数で十分です。

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

reduce 関数の場合は、 と入力するだけ_countです。

ビューの出力は次のようになります: (2 つのドキュメントに基づく)

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

そこから、名前とその頻度のリストが表示されます。そのリストを取得して自分でフィルター処理することも、「すべてのソファ」ルートを使用して_list関数を使用して最終的なフィルター処理を実行することもできます。

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

関数について読ん_listでください。関数は非常に便利で用途が広いです。

于 2012-01-27T22:44:04.820 に答える