2

我现在正在使用 riak 存储 json 文档,我想根据一些属性对它们进行排序,假设有一个键,即

{ "someAttribute": "whatever", "order": 1 }

所以我想根据“订单”对文件进行排序。

我目前正在使用 erlang 接口检索 riak 中的文档。我可以将文档作为字符串检索回来,但我真的不知道在那之后该怎么做。我在想 map 函数只是减少了 json 文档本身,并且在 reduce 函数中,我会检查我正在查看的项目是否具有比其余部分的头部更高的“顺序”列表,如果是,则追加到开头,然后返回列表:反向。

尽管我有上述想法,但几乎一整天后我的结果为零,但我对 riak 中的 erlang 接口感到非常困惑。有人可以提供有关如何编写此 map/reduce 函数或仅如何解析 json 文档的见解吗?

4

3 回答 3

1

据我所知,您无权访问地图中的输入列表。您从 Map 发出一个文档作为 1 个元素列表。

输入(作为 {Bucket, Key} 处理的所有文档)-> Map(处理单个文档)-> Reduce(从 Map 发出的整个列表)。

每个文档在许多节点上执行映射,而 Reduce 在所谓的协调节点(调用查询的节点)上执行一次。

解决方案:

  1. 定义输入(作为列表或存储桶)
  2. 检索 Map 中的值并发出整个文档或 {Id, Val_to_sort_by)
  3. 在 Reduce 中排序(使用常规列表:keysort)
于 2010-11-21T19:14:16.667 回答
0

这不是 map reduce 解决方案,但您应该查看Riak Search

于 2010-11-22T06:38:14.300 回答
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 文档进行测试,一个在上面,另一个只是名字:Billie,订单 2。这是我上面查询的结果

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

所以它有效!. 但我仍然需要在 ERLANG 中这样做,有什么见解吗?

于 2010-11-22T17:46:54.877 回答