使用JavaScript在Riak kv中使用MapReduce

时间:2016-09-18 15:42:20

标签: javascript mapreduce riak

我有关于Riak DB的数据,格式如下:

Bakshi - {u'friendlist': [u'Sita', u' Hari', u' Shyam', u' Howard', u' Bindu', u' Kishna', u' Karma', u' Dinesh'], u'is_active': True, u'user': u'Bakshi'}

这里通过Map / Reduce进行数据显示

client = riak.RiakClient()
user_bucket = client.add('userfriendlist')

user_bucket.map("""
       function(v){
           var data = JSON.parse(v.values[0].data);
           if(data.is_active == true){
               tempUser = data.user;
               tempFriendlist = data.friendlist;
               for (var i=0; i<tempFriendlist.length; i++){
                    friendValue = tempFriendlist[i];                                    
                    return [[tempUser,friendValue]];

               }           
           }
        }

      """)

并打印返回值

for result in user_bucket.run():
    print "%s - %s" % (result[0],result[1]);

它输出如下:

Bakshi - Sita

但预期的出现是:

Bakshi - Sita
Bakshi- Hari
Bakshi- Shyam
Bakshi- Howard
Bakshi- Bindu
Bakshi- Kishna
Bakshi- Karma
Bakshi- Dinesh

我在这里做错了什么,我不能在map()里面做迭代?

1 个答案:

答案 0 :(得分:1)

我对你正在使用的技术不太熟悉,但考虑到JS中的映射如何工作,我认为你一直在做的是返回你的函数中的第一个元素。 即你返回[Bakshi - Sita]作为你的结果,然后一旦它击中返回,映射函数就会停止。

我认为你需要做类似的事情:

user_bucket.map("""
   function(v){
       var data = JSON.parse(v.values[0].data);
       var mapped = [];
       if(data.is_active == true){
           tempUser = data.user;
           tempFriendlist = data.friendlist;
           for (var i=0; i<tempFriendlist.length; i++){
                friendValue = tempFriendlist[i]; 
                mapped.push[[tempUser, friendValue]];                                   
           }         
       }
       return mapped;  //if data.is_active == false, it will return empty array if you return here. If you want to return undefined for data.is_active == false, put this return statement inside your if, as the last thing after your for loop.
    }

  """)

我希望这会对你有所帮助。