我有关于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()里面做迭代?
答案 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.
}
""")
我希望这会对你有所帮助。