`
langzhe
  • 浏览: 288147 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Secondary Indexes in nosql of riak

    博客分类:
  • riak
 
阅读更多

官方文档

http://wiki.basho.com/Secondary-Indexes.html#Indexing-an-Object

 

在看官方文档时,描述的例子都是用crul描述的,而我是用的riak_erlang_client 只能看api尝试调用了

new/3方法中是提供不了索引的,不过有个update_medadata/2方法 可以根据这个方法插入数据,

我首先写入一个K-V,再立刻读取它,获取的medadata其实是一个dict(),在dict 中插入index,最后写入书库就实现了。

查询的时候用get_index/4即可

 

过程:

 

 

(ejabberd@meta)22> Bucket= <<"user">> .                                              

<<"user">>

(ejabberd@meta)23> Key= <<"langxw">>.                                                

<<"langxw">>

(ejabberd@meta)24> Value= term_to_binary({"jason","29","male"}).                     

<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,107,

  0,4,109,97,108,101>>

(ejabberd@meta)25> Age="29".                                                         

"29"

(ejabberd@meta)26> ObN=riakc_obj:new(Bucket, Key, Value).       根据Bucket,Key,Value构造数据

{riakc_obj,<<"user">>,<<"langxw">>,undefined,[],undefined,

           <<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,107,

             0,4,109,97,108,...>>} 

(ejabberd@meta)28> f(Pid), {ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087).

{ok,<0.582.0>}

(ejabberd@meta)29> riakc_pb_socket:put(Pid,ObN).                          把数据写入数据库

ok

(ejabberd@meta)30> {ok, ObR}=riakc_pb_socket:get(Pid,Bucket,Key). 再根据键值读出数据

{ok,{riakc_obj,<<"user">>,<<"langxw">>,

               <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,

                 250,223,188,122,42,131,41,...>>,

               [{{dict,2,16,16,8,80,48,

                       {[],[],[],[],[],[],[],[],[],[],[],[],...},

                       {{[],[],[],[],[],[],[],[],[],[],...}}},

                 <<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,

                   107,0,4,...>>}],

               undefined,undefined}}

(ejabberd@meta)31> Dict = riakc_obj:get_metadata(ObR)  得到metadata数据

(ejabberd@meta)31> .

{dict,2,16,16,8,80,48,

      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},

      {{[],[],[],[],[],[],[],[],[],[],

        [[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],

        [],[],

        [[<<"X-Riak-Last-"...>>|{1341,393029,...}]],

        [],[]}}}

(ejabberd@meta)32> DictN=di

dict               disk_log           disk_log_1         disk_log_server    

disk_log_sup       

(ejabberd@meta)32> DictN=dict:store( <<"index">>, [{"age_ing","29"}], Dict). 构造index

{dict,3,16,16,8,80,48,

      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},

      {{[],[],[],[],[],[],[],[],[],[],

        [[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],

        [[<<"index">>,{"age_ing","29"}]],

        [],

        [[<<"X-Riak-Last-"...>>|{1341,393029,...}]],

        [],[]}}}

(ejabberd@meta)33> ObRN=riakc_obj:update_metadata(ObR,DictN). 构造数据

{riakc_obj,<<"user">>,<<"langxw">>,

           <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,

             250,223,188,122,42,131,41,145,49,...>>,

           [{{dict,2,16,16,8,80,48,

                   {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},

                   {{[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},

             <<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,

               107,0,4,109,97,...>>}],

           {dict,3,16,16,8,80,48,

                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},

                 {{[],[],[],[],[],[],[],[],[],[],

                   [[<<...>>|...]],

                   [[...]],

                   [],...}}},

           undefined}

(ejabberd@meta)34> riakc_pb_socket:put(Pid, ObRN). 

{error,<<"{precommit_fail,[{unknown_field_type,<<\"age_ing\">>}]}">>}再次写入数据 int写成 ing所以写入失败

(ejabberd@meta)35> f(DictN),DictN=dict:store( <<"index">>, [{"age_int","29"}], Dict).

{dict,3,16,16,8,80,48,

      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},

      {{[],[],[],[],[],[],[],[],[],[],

        [[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],

        [[<<"index">>,{"age_int","29"}]],

        [],

        [[<<"X-Riak-Last-"...>>|{1341,393029,...}]],

        [],[]}}}

(ejabberd@meta)36> f(ObRN),ObRN=riakc_obj:update_metadata(ObR,DictN).                修正后再次写入

{riakc_obj,<<"user">>,<<"langxw">>,

           <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,

             250,223,188,122,42,131,41,145,49,...>>,

           [{{dict,2,16,16,8,80,48,

                   {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},

                   {{[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},

             <<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,

               107,0,4,109,97,...>>}],

           {dict,3,16,16,8,80,48,

                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},

                 {{[],[],[],[],[],[],[],[],[],[],

                   [[<<...>>|...]],

                   [[...]],

                   [],...}}},

           undefined}

(ejabberd@meta)37> riakc_pb_socket:put(Pid, ObRN).                                   

ok

(ejabberd@meta)38> riakc_pb

riakc_pb           riakc_pb_socket    

(ejabberd@meta)38> riakc_pb_socket:get_index(Pid, Bucket, <<"age_int">>, 29). 验证写入是否成功,OK 啦

{ok,[[<<"user">>,<<"langxw">>]]}

(ejabberd@meta)39> Key.

<<"langxw">>

(ejabberd@meta)40> 


注意:以上步骤有点繁琐,索引和value可以以此构造不用每次都写入数据库
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics