3

日付ごとに集計してユーザーを計算したい。次の map reduce 関数があります。

var m = function(){
    // creation date
    var d = new Date(parseInt(this._id.toString().slice(0,8), 16)*1000);
    // ticks
    var t = d.getTime();
    emit(d2,d3);
};

var r = function(k,v){
    return v[0];    // just go next with ticks
};

var opts = { out :  { merge : "UserAccum", db : "Metric"},
    finalize: function(k,v){
    var str = "parseInt(this._id.toString().slice(0,8), 16)*1000 <= "+v;
    return db.User.count({$where:str});         
} 
};
var res = db.Provider.mapReduce(m, r, opts);

実行すると、エラーが発生します:

Sat May 12 17:47:23 uncaught exception: map reduce failed:{
    "assertion" : "invoke failed: JS Error: TypeError: db has no properties
nofile_b:2",
    "assertionCode" : 9004,
    "errmsg" : "db assertion failure",
    "ok" : 0
}

db を呼び出すことができないようです。ファイナライズ内のメソッド。なんで?

map() と reduce() から呼び出すことができることを知っています

4

2 に答える 2

4

はい、map-reduce 関数でクエリを実行することはできません。入力パラメーターのみに依存する必要があります。

于 2012-05-12T12:01:22.093 に答える
0

mapreduce 関数内でクエリを実行できます。これは、db がデフォルト データベースへの参照であり、自動的に実行対象のデータベースではないということです。

したがって、これを行う必要があります: var fdb = db.getSiblingDB('yourdb'); var results = fdb.yourcollection.find(..);

これが新しいもので、1 年前のバージョンでは機能しなかったかどうかはわかりません。また、この場合の「できます」は「すべき」とは異なる場合があります。

于 2013-08-02T13:44:56.077 に答える