Sailsjs原生与Mapreduce

时间:2016-06-10 13:48:15

标签: mongodb orm sails.js waterline

我正在研究sailsjs项目,我只是想找到建议来实现以下输出,以便使用代码示例获得最佳性能。

我现有的收藏品中有以下文件。

[{
  "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 个答案:

答案 0 :(得分: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);
    }); 
});