2016-06-10 61 views
1

我正在sailsjs項目上工作,我只是尋找建議,以實現下面的輸出,使代碼示例獲得最佳性能。Sailsjs原生Mapreduce

我現有的集合有這個下面的文檔。

[{ 
    "word" : "DAD", 
    "createdAt":"6/10/2016 7:25:59 AM", 
"gamescore":1 
}, 
{ 
"word" : "SAD", 
"createdAt":"6/09/2016 7:25:59 AM", 
"gamescore":1 
}, 
{ 
    "word" : "PAD", 
     "createdAt":"6/10/2016 8:25:59 AM", 
    "gamescore":1 
}] 

我需要下面的輸出,就像這樣。

[{ 
    "word" : "A", 
    "repeatedTimes" : "3", 
    "LatestRepeatedTime": "6/10/2016 8:25:59 AM" 
    }, 
{ 
     "word" : "D", 
    "repeatedTimes" : "4", 
    "LatestRepeatedTime": "6/10/2016 8:25:59 AM" 
    }, 
{ 
    "word" : "P", 
    "repeatedTimes" : "1", 
    "LatestRepeatedTime": "6/10/2016 8:25:59 AM" 
    }, 
    { 
    "word" : "S", 
     "repeatedTimes" : "1", 
     "LatestRepeatedTime": "6/09/2016 8:25:59 AM" 
    }] 

對於上述方案,我實現下面的代碼來獲取,但它不是在找工作的查詢。

var m = function() { 
     var words = this.word; 
     if (words) { 
      for (var i = 0; i < words.length; i++) { 
       emit(words[i], 1); 
      } 
     } 
    } 

    var r = function (key, values) { 
     var count = 0; 
     values.forEach(function (v) { 
      count += v; 
     }); 
     return count; 
    } 
    console.log(req.params.childid); 
    Activity.native(function (err, collection) { 
     console.log("hello"); 
     collection.mapReduce(m, r, { 
      out: {merge: "words_count" + "_" + "575a4952bfb2ad01481e9060"} 
     }, function (err, result) { 
      Activity.getDB(function (err, db) { 
      var colname = "words_count" + "_" + "575a4952bfb2ad01481e9060"; 
      var natCol = db.collection('words_count' + "_" + "575a4952bfb2ad01481e9060"); 

       natCol.find({},..... **is not working** 

       natCol.count({}, function (err, docs) { 
        console.log(err); 
        console.log(docs); 
        res.ok(docs); 
       }); 
      }); 
     }); 
    }); 

答:

natCol.aggregate([ 
       { 
        $project: 
        { 
         _id: "$_id" , 
         value:"$value"       
        }  
       } 
       ], function(err, data){ 
        console.log(data); 
        res.ok(data); 
       }); 

回答

1

你可以嘗試以下

var m = function() {   
     if (this.word) { 
      for (var i = 0; i < this.word.length; i++) { 
       emit(this.word[i], { 
        "repeatedTimes": 1, 
        "LatestRepeatedTime": this.createdAt 
       }); 
      } 
     } 
    }; 

var r = function (key, values) { 
    var obj = {}; 
    values.forEach(function(value) { 
     printjson(value); 
     Object.keys(value).forEach(function(key) { 
      if (!obj.hasOwnProperty(key)) obj[key] = 0; 
      if (key === "repeatedTimes") obj[key] += value[key]; 
     }); 
     obj["LatestRepeatedTime"] = value["LatestRepeatedTime"]; 
    }); 
    return obj; 
}; 

var opts = { out: {inline: 1} }; 

Activity.native(function (err, collection) { 
    collection.mapReduce(m, r, opts, function (err, result) { 
     console.log(err); 
     console.log(result); 
     res.ok(result); 
    }); 
}); 
+1

這是非常乾淨的代碼。 awesomoe。謝謝chridam。我也得到了該地圖,並減少了您在sailsjs中使用本地使用時出現的一些混亂情況。我用上面的答案清理了我的代碼。謝謝@chridam。 –