nodejs + mongoose – 查询聚合

我有我的node.js应用程序的这个架构。 我正在使用mongoose:

var todoSchema = new Schema({ task: String, description: String, date: Date, status: String, checklist: Boolean, user: String }); 

我想得到这个结果,所以我可以将它传递到谷歌图表,并显示在图表上:

 [ { "user": "A", "detail" : [ "open" : 3, "progress" : 5, "done" : 7 "archive" : 10 ] }, { "user": "B", "detail" : [ "open" : 4, "progress" : 9, "done" : 14 "archive" : 12 ] } ] 

但我的查询看起来不正确:

 Todo.find().distinct( "user", function(err, users){ Todo.find({"user": {"$in": users}}, function(err, todo){ if (err) res.send(err); var finalResult = []; finalResult.push(todo); res.send(finalResult); //res.send(todo); }); }); }); 

有人可以帮我吗? 真的很感激你的帮助。

使用聚合框架并运行使用两个$group和$ projectpipe道步骤的以下聚合pipe道; 第一个是按user字段对文档进行分组,并使用$sum accumulator运算符expression式中的$cond运算符根据状态字段评估计数。 第二个$grouppipe道步骤将通过使用累加器操作符$push来添加detail数组,该操作符返回每个组的expression式值数组。 最后一步$project将通过将_id字段重命名为user来修改文档字段:

 var pipeline = [ { "$group": { "_id": "$user", "open_count": { "$sum": { "$cond": [ { "$eq": [ "$status", "open" ] }, 1, 0 ] } }, "progress_count": { "$sum": { "$cond": [ { "$eq": [ "$status", "progress" ] }, 1, 0 ] } }, "done_count": { "$sum": { "$cond": [ { "$eq": [ "$status", "done" ] }, 1, 0 ] } }, "archive_count": { "$sum": { "$cond": [ { "$eq": [ "$status", "archive" ] }, 1, 0 ] } } } }, { "$group": { "_id": "$_id", "detail": { "$push": { "open": "$open_count", "progress": "$progress_count", "done": "$done_count", "archive": "$archive_count" } } } }, { "$project": { "_id": 0, "user": "$_id", "detail": 1 } } ]; Todo.aggregate(pipeline, function (err, result){ if (err) res.send(err); console.log(JSON.stringify(result, undefined, 4)); res.send(result); }) 

这应该适合你。 简单地得到所有的todos。 处理错误时不要忘记return

 Todo.find({}, function(err, todos){ if (err) return res.send(err); res.send(todos) })