我正在使用riak来存储json文档,我想根据某些属性对它们进行排序,假设有一个密钥,即
{ “someAttribute”:“不管”, “命令”:1 }
所以我想根据“订单”对文档进行排序。
我目前正在使用erlang界面检索riak中的文档。我可以将文档作为字符串检索回来,但我真的不知道在那之后该怎么做。我认为map函数只是减少了json文档本身,而在reduce函数中,我会检查我正在查看的项目是否具有比其余部分更高的“顺序”。 list,如果是,则追加到开头,然后返回一个列表:reverse。
尽管我的想法在上面几乎整整一天后都没有结果,但我对riak中的erlang界面感到困惑。有人可以提供有关如何编写此map / reduce函数的洞察,或者只是如何解析json文档?
答案 0 :(得分:1)
据我所知,您无法访问Map中的输入列表。您将Map文档作为1个元素列表发出。
输入(所有要处理的文档为{Bucket,Key}) - >地图(处理单个文档) - >减少(从地图发出的整个列表)。
在许多节点上按照每个文档执行映射,而在所谓的协调器节点(调用查询的节点)上执行一次Reduce。
解决方案:
答案 1 :(得分:0)
这不是地图缩减解决方案,但您应该查看Riak Search。
答案 2 :(得分: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文件用于测试,一个在上面,ohter只是firstName:Billie,order 2.这里是我上面查询的结果
[{"1":{"firstName":"John","order":1},"2":{"firstName":"Billie","order":2}}]
所以它有效! 。但我仍然需要在ERLANG做任何见解吗?