2

私は現在、riak を使用して json ドキュメントを保存しています。いくつかの属性に基づいてそれらを並べ替えたいと考えています。たとえば、キーがあるとします。

{ "someAttribute": "何でも", "順序": 1 }

そのため、「順序」に基づいてドキュメントを並べ替えたいと考えています。

現在、erlang インターフェイスを使用して riak でドキュメントを取得しています。ドキュメントを文字列として取得できますが、その後どうすればよいかわかりません。map 関数は json ドキュメント自体を縮小するだけだと考えています。reduce 関数では、見ている項目が残りの部分の先頭よりも高い「順序」を持っているかどうかを確認します。リストであり、そうであれば先頭に追加してから、lists:reverse を返します。

上記の私の考えにもかかわらず、ほぼ丸一日経っても結果はゼロでした。riak の erlang インターフェースにとても混乱しています。このマップ/リデュース関数の書き方、またはjsonドキュメントの解析方法について誰かが洞察を提供できますか?

4

3 に答える 3

1

私の知る限り、あなたはマップの入力リストにアクセスできません。Map a document as 1 element リストから出力します。

入力 ({Bucket, Key} として処理するすべてのドキュメント) -> Map (単一のドキュメントを処理) -> Reduce (Map から出力されたリスト全体)。

マップは多くのノードで各ドキュメントごとに実行されますが、Reduce はいわゆるコーディネーター ノード (クエリが呼び出されたノード) で 1 回実行されます。

解決:

  1. 入力の定義 (リストまたはバケットとして)
  2. Map で値を取得し、ドキュメント全体または {Id, Val_to_sort_by) を出力します
  3. Reduce での並べ替え (通常の list:keysort を使用)
于 2010-11-21T19:14:16.667 に答える
0

だから私はjavascriptを使って問題を「解決」しましたが、それでもerlangを使ってそれを行うことはできません。これが私の質問です

{"inputs":"test",
 "query":[{"map":{"language":"javascript",
                  "source":"function(value, keyData, arg){ var data = Riak.mapValuesJson(value)[0]; var obj = {}; obj[data.order] = data; return [ obj ];}"}},
         {"reduce":{"language":"javascript",
                    "source":"function(values, arg){ return [ values.reduce(function(acc, item){ for(var order in item){ acc[order] = item[order]; } return acc;  }) ];}",
                    "keep":true}}
         ]
}

したがって、マップフェーズでは、キーを順序として、値をデータ自体として、新しい配列objを作成するだけです。視覚的には、objは次のようになります

{"1":{"firstName":"John","order":1}

リデュースフェーズでは、アキュムレータに入れるだけなので、基本的にはそういうことです。終わったら、すべてが整頓されるからです。だから私はテストのために2つのjsonドキュメントを置きました。1つは上にあり、もう1つはfirstName:Billie、order2です。これが上記のクエリの結果です。

[{"1":{"firstName":"John","order":1},"2":{"firstName":"Billie","order":2}}]

だからそれは動作します!。しかし、私はまだERLANGでこれを行う必要があります、何か洞察はありますか?

于 2010-11-22T17:46:54.877 に答える
0

これはマップ削減ソリューションではありませんが、 Riak Searchをチェックしてください。

于 2010-11-22T06:38:14.300 に答える