2013-01-09 105 views
0

我想在地图reduce中使用findOne。我的代码有什么问题?我的错误是:findOne在mapreduce中使用mongodb

命令'mapreduce'失败:异常:映射调用失败:JS错误:TypeError:用户没有属性nofile_b:3(response:{“errmsg”:“exception:map invoke failed:JS Error:类型错误:用户没有属性nofile_b:3" , “代码”:9014, “OK”:0.0})

string map = @" 
function() { 
    var movie = this; 
    var user = db.users.findOne({UserId : parseInt(movie.UserId)}); 
    emit(movie.UserId, {Name:user.Name}); 
}"; 


string reduce = @"   
function(key, values) { 
    var result =values; 
    return result; 
}"; 

string finalize = @" 
function(key, value){   
    return value; 

}"; 

在C#代码

var collection = database.GetCollection("movies"); 
var options = new MapReduceOptionsBuilder(); 
options.SetFinalize(finalize); 
options.SetOutput(MapReduceOutput.Inline); 
var results = collection.MapReduce(map, reduce, options); 
lbResultList.Items.Clear(); 
foreach (var result in results.GetResults()) 
{ 
    lbResultList.Items.Add(result.ToJson()); 
} 

我解决我的问题映射函数变化

function() { 

var user = db.users.find({UserId:this.UserId}); 
var userName =''; 
var userSurName =''; 
user.forEach(function(u) { 
    userName = u.Name; 
    userSurName = u.SurName; 
}); 
emit(
    this._id,     
    {title: this.Title,category:this.Category,UserName: userName,UserSurName: userSurName} 
); 

}

我认为这是不合逻辑的,就像子查询这个解决方案一样。我能做些什么呢?

+2

你是不是允许使用来自MR的db对象。我不确定你是如何通过这个代码来的,因为在MongoDBs网站上使用MR中的db对象所提到的所有信息在1.6版本中被取出,如果不是早的话 – Sammaye

+0

您已经创建了两个集合 - 这意味着您将需要始终执行两个查询来“加入”他们的输出。如果这是不可接受的,您可能会考虑更改您的架构以适应在单个集合操作中获取有关用户和电影信息的要求。 –

回答

0

它看起来像你试图做一个SQL JOIN。 MapReduce是错误的工具。你会真的想就这么闯进了总操作这个让用户ID的数组和查询操作以获取用户名:

像这样的事情在蒙戈外壳:

var UserIDArray = []; 
movieCollection.aggregate({$group: {_id: "$UserId"}}).forEach(function (v) { 
    UserIDArray.push(v._id); 
}); 

UserIDNamePairs = userCollection.find({_id : {$in: UserIdArray}}, {_id: "$name"}).toArray();