如何使用Mongoosejs按查询编写组?

时间:2011-11-12 23:46:49

标签: javascript mongodb node.js mongoose

我正在使用nodejs,mongoose odm和mongo作为网络应用程序,并且遇到试图在mongoose中运行“group by”样式查询的问题:

var results = mymodel.collection.group (
{   
    keyf:
        function(doc)
        {
                var m = doc.date.getMonth();
                var d = doc.date.getDate();
                var y = doc.date.getFullYear();
                return { date: m + "/" + d + "/" + y };
        },
    cond: {},
    reduce: function(doc,prev) { prev.total += doc.value; },
    initial: { total: 0 }
}
);
if(results == null)
{
    console.log("results is null\n");
}

如果我在mongo shell中运行“mymodel.collection.group”代码,它可以完美运行。但是,在nodejs / mongoose中,它似乎返回null结果,即使mongoose文档声明可以对本机mongo驱动程序执行直接mongo代码。

有没有人有任何想法如何解决?

2 个答案:

答案 0 :(得分:1)

我刚刚设法在Mongoose中做到了。要做到这一点,你需要创建一个链式调用,并在回调中执行reduce。

var foo = function(name, callback){
 Model.where('user', name).
        select('points').
        run(callback);
}

所以上面是地图,然后是

foo(name, function(errors, docs){ 
                var score = 0; 
                for (var i=0; i < docs.length; i++){ 
                  score += docs[i].points;
                });

目前适用于我的需求

答案 1 :(得分:-1)

我有类似的问题,我可以使用聚合框架来做到这一点。

mymodel.collection.aggregate( { $match : CONDITION }, { $group : _id : { year : { $year : "$date"}, month : { $month : "$date"}, day : { $dayOfMonth : "$date"} }, count : { $sum : 1 } }, { $project : { date : { year : "$_id.year", month : "$_id.month", day : "$_id.day" } }, { $sort : { "date.year" : 1, "date.month" : 1, "date.day" : 1 } }, function(err, res) { ..callback function..} );

相关问题