Riak kv 中的 MapReduce 使用 JavaScript

MapReduce in Riak kv using JavaScript

我在 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]];

               }           
           }
        }

      """)

并打印 return 值

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() 中进行迭代?

我不是很熟悉你使用的技术,但考虑到映射在 JS 中的工作方式,我认为你一直在做的是 return 作为函数结果的第一个元素。 即你 return [Bakshi - Sita] 作为你的结果然后映射函数停止,一旦它命中 return.

我认为你需要做如下事情:

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.
    }

  """)

希望对您有所帮助。