【问题标题】:findOne use in mapreduce mongodbfindOne 在 mapreduce mongodb 中的使用
【发布时间】:2013-01-09 13:31:26
【问题描述】:

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

命令'mapreduce'失败:异常:映射调用失败:JS错误:TypeError:用户没有属性nofile_b:3(响应:{“errmsg”:“异常:映射调用失败:JS错误:TypeError:用户没有属性 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}  
); 

}

我认为这不合逻辑,就像子查询这样解决。这种情况我该怎么办?

【问题讨论】:

  • 不允许使用 MR 的 db 对象。我不确定你是怎么得到这段代码的,因为 MongoDBs 网站上提到的在 MR 中使用 db 对象的所有信息都在 1.6 版中删除,如果不是更早的话
  • 您已经创建了两个集合 - 这意味着您将需要始终执行两个查询来“加入”它们的输出。如果这是不可接受的,您可能会考虑更改架构以适应在单个收集操作中获取有关用户和电影的信息的要求。

标签: mongodb


【解决方案1】:

您似乎正在尝试执行 SQL JOIN。 MapReduce 是错误的工具。您实际上只想将其分解为聚合操作以获取用户 ID 数组和查询操作以获取用户名:

在 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();

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多