2013-01-09 149 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();