0

次のフィールドを持つコレクションがあります。

TestTable
{
        "ID"
        "Name"
        "Ver" 
        "Serial"
        "DateTime"
        "FeatureID"
        "FeatureName"
}

特定の年のレコード数を取得するための map reduce 関数が必要です。私が書いたマップ削減関数は次のとおりです。

map= function(){
    year= Date.UTC(this.DateTime.getFullYear());
    emit({year: year}, {count: 1});
}

reduce= function(key, values){
    var count=0;
    for(v in values){
        count+= v['count'];
    });
    return {count: count};
}

これで、出力は各年の douments の数を示すはずです。マップリデュース機能は正しいですか?

私が得た結果は次のとおりです。

> db.Years.find()
{ "_id" : { "year" : NaN }, "value" : { "count" : NaN } }
> db.Years.find().count()
1

これは私が期待したものではありません。

編集済み

TestTable ドキュメントの 1 つ:

> db.TestTable.findOne()
{
        "_id" : ObjectId("527c48e99000cf10bc2a1d82"),
        "ID" : "LogID16587",
        "Name" : "LogName15247",
        "Ver" : "VersionID11",
        "Serial" : "ProductID727",
        "DateTime" : ISODate("1998-12-15T18:30:00Z"),
        "FeatureID" : "FeatureID465",
        "FeatureName" : "FeatureName 1460"
}

前もって感謝します。

4

1 に答える 1

1

Date.UTC年と月の両方のパラメーターが必要です。したがって、map関数は次のようになります。

map= function(){
    year= Date.UTC(this.DateTime.getFullYear(), 0);
    emit({year: year}, {count: 1});
}

また、使用している方法では機能しないためin、メソッド内の配列の要素を反復処理するために使用しないでください。reduce代わりに従来のforループを使用します。

reduce= function(key, values){
    var count=0;
    for(var i=0; i<values.length; i++) {
        count += values[i]['count'];
    };
    return {count: count};
}
于 2013-11-13T04:40:15.010 に答える