2015-11-23 86 views
1

我有我的node.js应用程序的这个模式。我使用的是猫鼬:nodejs + 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); 
    }); 
    }); 
}); 

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

+0

您specifing不同的方法里面的“PIC”领域,但我没有看到你todoSchema里面的那场。你有什么错误吗? –

+0

@NikolaB。对于错字感到抱歉。我已经编辑了我的文章并将其更改为用户。谢谢你的纠正。 – lamfete

回答

3

使用aggregation framework时,不要忘了return并运行以下聚合管道使用两个$group和$项目渠道的步骤;第一个是将您的文档按user字段分组,并使用$sum累加器运算符表达式根据状态字段评估计数。第二个$group$group流水线步骤将通过使用累加器运算符$push添加detail数组,该数组返回每个组的表达式值数组。最后一步$project将通过重命名_iduser修改文档字段:

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); 
}) 
+0

感谢您的帮助。我很抱歉我的愚蠢问这样的问题,我仍然在学习mongodb和nodejs。非常感谢您的帮助。 – lamfete

+0

@lamfete不用担心,总是乐于帮助:-)如果这回答您的问题,请考虑标记[**答案为接受**](http://stackoverflow.com/help/accepted-answer)。您可以通过单击答案旁边的复选标记来将其切换为灰色填充。您可以随时更改接受答案,或者简单地拒绝接受答案。请注意,接受答案没有义务,但可以随意这样做,因为这是这里的标准。还可以考虑对其他问题进行练习。欢迎来到StackOverflow! – chridam

+1

对不起,我以前不知道在答案旁边切换清单。我已经点击它的这篇文章和我的文章之前,你是否也回答了它:) – lamfete

0

这应该适合你。简单地获取所有的待办事项。 处理错误

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

    res.send(todos) 
})