0

findOneマップリデュースで使いたい。コードの何が問題になっていますか? 私のエラーは次のとおりです。

コマンド 'mapreduce' が失敗しました: 例外: マップの呼び出しに失敗しました: JS エラー: TypeError: ユーザーにプロパティがありません nofile_b:3 (応答: { "errmsg" : "例外: マップの呼び出しに失敗しました: JS エラー: TypeError: ユーザーにプロパティがありません 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());
}

私の問題を解決します map 関数の変更

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}  
); 

}

サブクエリのように、これは論理的ではないと思います。この場合、どうすればよいですか?

4

1 に答える 1

0

SQLJOINを実行しようとしているようです。MapReduceはそのための間違ったツールです。実際には、これを集約操作に分割してUserIDの配列を取得し、クエリ操作でユーザーの名前を取得する必要があります。

mongoシェルでのこのようなもの:

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

UserIDNamePairs = userCollection.find({_id : {$in: UserIdArray}}, {_id: "$name"}).toArray();
于 2013-01-09T23:18:14.420 に答える