里亚克';s erlang pb客户端和映射获取

里亚克';s erlang pb客户端和映射获取,erlang,riak,Erlang,Riak,我试图在Riak中存储寄存器和集合的映射,并使用Riak的pb客户端处理它们。我的目标是保存映射,然后从返回的对象中提取持久化映射并对其进行处理(在本例中,从集合中提取寄存器、值并转换为JSON)。似乎试图使用riakc_映射:fetch从返回的对象中提取值不是正确的方法 下面是我创建它的方式(键是uuid,QP是INT列表): 二进制_到_项后的Post(riakc_obj:get_值(Obj2));就我所知,看起来是正确的: < Post = {map,[], [{

我试图在Riak中存储寄存器和集合的映射,并使用Riak的pb客户端处理它们。我的目标是保存映射,然后从返回的对象中提取持久化映射并对其进行处理(在本例中,从集合中提取寄存器、值并转换为JSON)。似乎试图使用riakc_映射:fetch从返回的对象中提取值不是正确的方法

下面是我创建它的方式(键是uuid,QP是INT列表):

二进制_到_项后的Post(riakc_obj:get_值(Obj2));就我所知,看起来是正确的:

< Post = {map,[],
          [{{<<"content">>,register},
            {register,<<>>,<<"<post>Hello, World!\r\n</post>">>}},
           {{<<"post_id">>,register},
            {register,<<>>,<<"238e4300-a651-11e4-86c8-6003088f077a">>}},
           {{<<"userids">>,set},
              [{set,[],[<<"-1">>],[],undefined}]},
            .....
},
{{,寄存器},
{寄存器,,}},
{{,set},
[{set、[]、[]、[]、未定义的}]},
.....

非常感谢您的帮助!

有几件事不太对劲。此呼叫需要更新

M2 = riakc_map:update({<<"userids">>, set}, 
    fun(S) ->
        [riakc_set:add_element(helpers:int_to_bin(Q), S) || Q <- QP]
    end, M1),
检索映射并检查值
3>{ok,Map}=riakc\u pb\u套接字:获取类型(Pid,{type,Bucket},Key),
3> riakc_映射:值(映射)。
[{,寄存器},},
{{,set},
[,,,,,,,
,,]}]
4> riakc_映射:获取_键(映射)。
[{,寄存器},{,集合}]
5> riakc_映射:is_键({,寄存器},映射)。
符合事实的
6> riakc_映射:is_键({},map)。
错误的
为了进行比较,这是存储之前的值:

7> M2.

#map{value = [],
     updates = [{{<<"post_id">>,register},
                 {register,<<>>,<<"testkey">>}},
                {{<<"userids">>,set},
                 {set,[],
                      [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                       <<"7">>,<<"8">>,<<"9">>],
                      [],undefined}}],
     removes = [],context = undefined}
7>M2。
#映射{value=[],
更新=[{,寄存器},
{寄存器,,}},
{{,set},
{set,[],
[,,,,,,,
,,],
[],未定义}}],
删除=[],上下文=未定义}
这是最终值:

8> Map.
#map{value = [{{<<"post_id">>,register},<<"testkey">>},
              {{<<"userids">>,set},
               [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                <<"7">>,<<"8">>,<<"9">>]}],
     updates = [],removes = [],
     context = <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,
                 249,120,246,57,114,97,8,106>>}
8>地图。
#映射{value=[{,寄存器},},
{{,set},
[,,,,,,,
,,]}],
更新=[],删除=[],
上下文=}
通过隐式获取处理对现有映射的更改:

2> riakc_pb_socket:modify_type(Pid,
                 fun(OldMap) ->
                    riakc_map:update({<<"userids">>, set},
                               fun(S) ->
                                   riakc_set:add_element(<<"100">>, S)
                               end, OldMap)
                 end,
                 {Type,Bucket},Key,[]).
ok
3> riakc_pb_socket:fetch_type(Pid,{Type,Bucket},Key).
{ok,{map,[{{<<"post_id">>,register},<<"testkey">>},
      {{<<"userids">>,set},
       [<<"1">>,<<"10">>,<<"100">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,
        <<"6">>,<<"7">>,<<"8">>,<<"9">>]}],
     [],[],
     <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,249,120,
       246,57,114,97,...>>}}
2>riakc_pb_插槽:修改_类型(Pid,
乐趣(旧地图)->
riakc_映射:更新({,set},
乐趣->
riakc_集:添加元素(,S)
完(旧地图)
终止
{Type,Bucket},Key,[])。
好啊
3> riakc_pb_套接字:fetch_类型(Pid,{type,Bucket},Key)。
{好,{map,[{,寄存器},},
{{,set},
[,,,,,,,
,,,]}],
[],[],
}}

有几件事不太对劲。此更新调用

M2 = riakc_map:update({<<"userids">>, set}, 
    fun(S) ->
        [riakc_set:add_element(helpers:int_to_bin(Q), S) || Q <- QP]
    end, M1),
检索映射并检查值
3>{ok,Map}=riakc\u pb\u套接字:获取类型(Pid,{type,Bucket},Key),
3> riakc_映射:值(映射)。
[{,寄存器},},
{{,set},
[,,,,,,,
,,]}]
4> riakc_映射:获取_键(映射)。
[{,寄存器},{,集合}]
5> riakc_映射:is_键({,寄存器},映射)。
符合事实的
6> riakc_映射:is_键({},map)。
错误的
为了进行比较,这是存储之前的值:

7> M2.

#map{value = [],
     updates = [{{<<"post_id">>,register},
                 {register,<<>>,<<"testkey">>}},
                {{<<"userids">>,set},
                 {set,[],
                      [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                       <<"7">>,<<"8">>,<<"9">>],
                      [],undefined}}],
     removes = [],context = undefined}
7>M2。
#映射{value=[],
更新=[{,寄存器},
{寄存器,,}},
{{,set},
{set,[],
[,,,,,,,
,,],
[],未定义}}],
删除=[],上下文=未定义}
这是最终值:

8> Map.
#map{value = [{{<<"post_id">>,register},<<"testkey">>},
              {{<<"userids">>,set},
               [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                <<"7">>,<<"8">>,<<"9">>]}],
     updates = [],removes = [],
     context = <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,
                 249,120,246,57,114,97,8,106>>}
8>地图。
#映射{value=[{,寄存器},},
{{,set},
[,,,,,,,
,,]}],
更新=[],删除=[],
上下文=}
通过隐式获取处理对现有映射的更改:

2> riakc_pb_socket:modify_type(Pid,
                 fun(OldMap) ->
                    riakc_map:update({<<"userids">>, set},
                               fun(S) ->
                                   riakc_set:add_element(<<"100">>, S)
                               end, OldMap)
                 end,
                 {Type,Bucket},Key,[]).
ok
3> riakc_pb_socket:fetch_type(Pid,{Type,Bucket},Key).
{ok,{map,[{{<<"post_id">>,register},<<"testkey">>},
      {{<<"userids">>,set},
       [<<"1">>,<<"10">>,<<"100">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,
        <<"6">>,<<"7">>,<<"8">>,<<"9">>]}],
     [],[],
     <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,249,120,
       246,57,114,97,...>>}}
2>riakc_pb_插槽:修改_类型(Pid,
乐趣(旧地图)->
riakc_映射:更新({,set},
乐趣->
riakc_集:添加元素(,S)
完(旧地图)
终止
{Type,Bucket},Key,[])。
好啊
3> riakc_pb_套接字:fetch_类型(Pid,{type,Bucket},Key)。
{好,{map,[{,寄存器},},
{{,set},
[,,,,,,,
,,,]}],
[],[],
}}

感谢您花时间对此做出如此详细的回应。同时,感谢您纠正了列表理解问题。我计划使用update\u type()进行创建,以避免执行不必要的获取操作,而modify\u type()无论是否将create作为选项传入()。我错误地将访问数据的旧方法与处理CRDT的新方法混为一谈。感谢您花时间对此做出如此详细的回应。同时,感谢您纠正了列表理解问题。我计划使用update_type()进行创建,以避免执行修改_type()的不必要的获取不管将create作为选项()传入,我都会这样做。我错误地将访问数据的旧方法与处理CRDT的新方法混合在一起。
1> rr(riakc_map).
[map]
2> {ok,Pid}=riakc_pb_socket:start("127.0.0.1",8087),
2> M=riakc_map:new(),
2> Key = <<"testkey">>,
2> Bucket = <<"testbucket">>,
2> Type = <<"maps">>,
2> QP = lists:seq(1,10),
2> M1 = riakc_map:update({<<"post_id">>, register},
2> fun(R) -> riakc_register:set(Key, R) end, M),
2> M2 = riakc_map:update({<<"userids">>, set},
2> fun(S) ->
2> lists:foldl(fun(Q,Acc) -> riakc_set:add_element(list_to_binary(integer_to_list(Q)), Acc) end,S, QP)
2> end, M1),
2> riakc_pb_socket:modify_type(Pid,fun(_) -> M2 end,{Type,Bucket},Key,[create]).
ok
3> {ok,Map} = riakc_pb_socket:fetch_type(Pid,{Type,Bucket},Key),
3> riakc_map:value(Map).
[{{<<"post_id">>,register},<<"testkey">>},
 {{<<"userids">>,set},
  [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
   <<"7">>,<<"8">>,<<"9">>]}]
4> riakc_map:fetch_keys(Map).
[{<<"post_id">>,register},{<<"userids">>,set}]
5> riakc_map:is_key({<<"post_id">>, register}, Map).
true
6> riakc_map:is_key({<<"post_id">>}, Map).
false
7> M2.

#map{value = [],
     updates = [{{<<"post_id">>,register},
                 {register,<<>>,<<"testkey">>}},
                {{<<"userids">>,set},
                 {set,[],
                      [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                       <<"7">>,<<"8">>,<<"9">>],
                      [],undefined}}],
     removes = [],context = undefined}
8> Map.
#map{value = [{{<<"post_id">>,register},<<"testkey">>},
              {{<<"userids">>,set},
               [<<"1">>,<<"10">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,<<"6">>,
                <<"7">>,<<"8">>,<<"9">>]}],
     updates = [],removes = [],
     context = <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,
                 249,120,246,57,114,97,8,106>>}
2> riakc_pb_socket:modify_type(Pid,
                 fun(OldMap) ->
                    riakc_map:update({<<"userids">>, set},
                               fun(S) ->
                                   riakc_set:add_element(<<"100">>, S)
                               end, OldMap)
                 end,
                 {Type,Bucket},Key,[]).
ok
3> riakc_pb_socket:fetch_type(Pid,{Type,Bucket},Key).
{ok,{map,[{{<<"post_id">>,register},<<"testkey">>},
      {{<<"userids">>,set},
       [<<"1">>,<<"10">>,<<"100">>,<<"2">>,<<"3">>,<<"4">>,<<"5">>,
        <<"6">>,<<"7">>,<<"8">>,<<"9">>]}],
     [],[],
     <<131,108,0,0,0,1,104,2,109,0,0,0,8,35,9,254,249,120,
       246,57,114,97,...>>}}