我想在map reduce中使用findOne
。我的代码出了什么问题?我的错误是:
命令'mapreduce'失败:异常:map调用失败:JS错误:TypeError:用户没有属性nofile_b:3(响应:{“errmsg”:“异常:map调用失败:JS错误:TypeError:用户没有properties nofile_b:3“,”code“: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}
);
}
我认为这不合逻辑,就像子查询这样解决。我能做些什么呢?
答案 0 :(得分:0)
看起来你正在尝试做一个SQL JOIN。 MapReduce是错误的工具。您实际上只想将其分解为聚合操作以获取UserID数组和查询操作以获取用户名称:
在mongo shell中有这样的东西:
var UserIDArray = [];
movieCollection.aggregate({$group: {_id: "$UserId"}}).forEach(function (v) {
UserIDArray.push(v._id);
});
UserIDNamePairs = userCollection.find({_id : {$in: UserIdArray}}, {_id: "$name"}).toArray();