我正在使用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代码。
有没有人有任何想法如何解决?
答案 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..}
);