2

だから私は次のコードを持っています。MongoDBシェルで実行するために必要です。これは、属性がtrueとマークされているユーザーをデータベースに照会します。クエリのnumcollect部分を配列に変更する方法がわからないため、問題が発生しています。numcollectコレクションのすべての数値を平均化しようとしています。このコードが正しくないことは知っていますが、私がやろうとしていることを示しています。何を変更する必要がありますか?

データベース:

{
     "name":"John Doe",
     "attribute":"true",
     "numcollect":{
        "one":12,
        "two":22,
        "three":44,
        "four":79
     }
},
{
     "name":"Jane Doe",
     "attribute":"true",
     "numcollect":{
        "one":13,
        "two":55,
        "three":18
     }
}

コード

var people= [];
var index = 0;
db.test.find({"attribute":"true"}).forEach(
    function(myDoc) { 
        var person=new Object();
        person.name=myDoc.name;
        person.numcollect=myDoc.numcollect;
        person.numavg = 0;
        var i = 0;
        for(i = 0; i<numcollect.length; i++)
        {
            person.numavg+=person.numcollect[i];
        }
        person.numavg/=i;
        people[index]=person;
        index++;
    } 
);
4

2 に答える 2

1

したがって、まず第一に、この質問は MongoDB とは関係ありません (多かれ少なかれ標準の JavaScript 実装を使用するため)。JavaScript でディクショナリ/オブジェクトの値をループする方法を知りたいだけです。

for (var i in numcollect) {
    if (numcollect.hasOwnProperty(i)) {
        person.numavg += numcollect[i];
    }
}
于 2013-02-08T07:28:32.360 に答える
0

これは1つの答えです:

collection.mapReduce(function(){
            for(var key in this.numcollect)
                emit(this._id, this.numcollect[key])
        }, function(key, values){
            return Array.sum(values)
        },{
            out:{inline:1}
        }, function(err, doc){
            if(err){
                console.log("mapReduce ERROR", err);
            }else{
                console.log("mapReduce Result", doc);
            }
        })
于 2013-08-14T01:38:57.633 に答える