我无法使用 map reduce 旋转我的数据集。我一直在使用 MongoDB 食谱寻求帮助,但我遇到了一些奇怪的错误。我想获取下面的集合并对其进行旋转,以便每个用户都有一个所有评论评级的列表。
我的收藏看起来像这样:
{
'type': 'review',
'business_id': (encrypted business id),
'user_id': (encrypted user id),
'stars': (star rating),
'text': (review text),
}
映射函数(用 Python 封装):
map = Code(""""
function(){
key = {user : this.user_id};
value = {ratings: [this.business_id, this.stars]};
emit(key, value);
}
""")
map 函数应该返回一个与键关联的值数组... Reduce 函数(包装在 Python 中):
reduce = Code("""
function(key, values){
var result = { value: [] };
temp = [];
for (var i = 0; i < values.length; i++){
temp.push(values[i].ratings);
}
result.value = temp;
return result;
}
""")
但是,结果返回的评分比总评分少一个。事实上,有些用户没有返回 None,这是不可能的。一些条目如下所示:
{u'_id': {u'user: u'zwZytzNIayFoQVEG8Xcvxw'}, u'value': [None, [u'e9nN4XxjdHj4qtKCOPQ_vg', 3.0], None, [...]...]
我无法确定我的代码中是什么导致了这种情况。如果有 3 条评论,它们在文档中都有商家 ID 和评级。另外,由于某种原因,在我的循环条件中使用 'values.length + 1' 会破坏 values[i] 。
编辑 1
我已经接受了 reduce 被多次调用的事实,所以下面是我的新 reducer。这将返回 [business, rating, business, rating] 的数组。知道如何输出 [business, rating] 数组而不是一个巨大的数组吗?
function(key, value){
var result = { ratings:[] };
var temp = [];
values.forEach(function(value){
value.ratings.forEach(function(rating){
if(temp.indexof(rating) == -1){
temp.push(rating);
}
});
});
result. rartings = temp;
return result;
}