2016-02-12 66 views
2

我有一个在mongodb中的集合,如下所述。节点js,Mongoose计算总和并返回多个字段

{ "UserID" : "User1", 
    "TaskId" : "Task1", 
    "SubTaskID" : "Subtask1", 
    "StartDate" : ISODate("2016-02-06T05:00:00Z"), 
    "EndDate" : ISODate("2016-02-06T05:00:00Z"), 
    "Hours" : 8, //no of hours worked between StartDate and EndDate on the subtask 
    "Department:"DEPT1"; //I can have multiple departments 
    "__v" : 0} 

现在我想计算的开始日期和结束日期以及由该期间内所有成员的部门进入该子任务的总小时数之间的总工作时数。我的输出应该像

{ 
    "TaskId":"TaskId1", 
    "UserId":"UserId1", 
    "startDate":"2016-02-06", 
    "endDate":"2016-02-06", 
    "totalHours": 10.0, 
    "deptTotalHours":100.0, 
    "subtasks": [ 
    { 
     "SubTaskID": "SubTask1", 
     "totalHours": 4.0, 
     "deptTotalHours":40.0 
    }, 
    { 
     "SubTaskID": "SubTask2", 
     "totalHours": 6.0, 
     "deptTotalHours":60.0 
    }] 
} 

我与$匹配,$项目和$组试过,但我不能BLE得到指定格式的响应。有人可以建议我如何获得上述指定格式的回复吗?

+0

所以,如果我理解正确的话,那么“totalHours”,就是要通过选定的用户?或者可能是所有用户,但只是组中的当前用户?那么什么是“deptTotalHours”?它是否与当前用户不同?或者是否有其他逻辑背后会选择“部门”?这些是你的解释中缺少逻辑的部分,可以在编辑中加以阐述。 –

+0

嗨七,非常感谢您的快速回复。请在下面找到解释。 totalHours:所选用户在该持续时间内在特定子任务上工作的总小时数。 deptTotalHours:部门中所有用户(包括所选用户)在该子任务内工作的总时间。 – Rams

回答

0

使用以下流水线操作,它将为您提供子任务所需的全部信息。然后,所有子任务中的totalHours,deptTotalHours只是子任务结果(您可以在应用程序中执行)中的记录总和。其他信息可作为您输入本身的一部分。

pipeline = [ { $match: {} // Add criteria based on start and end date, don't include UserID criteria here }, { $group: { _id: '$SubTaskID', deptTotalHours: {$sum: '$Hours'}, totalHours: {$sum: {$cond:[ {$eq: ['$UserID', inputUserId]}, '$Hours', 0.0 ]} } } } ];

+0

Hi Poorna,非常感谢您的回复。我已经实现了你建议的方式,但以下面的格式获得响应。 totalHours字段总是返回0. totalHours:{$ sum:{$ cond:[$ {eq:['$ UserID',inputUserId]} – Rams

+0

@Rams您是否已经使用所需的用户ID启动了inputUserId?我已经在你的问题中用inputUserId ='User1'运行这个管道,它返回{“_id”:“Subtask1”,“deptTotalHours”:8,“totalHours”:8} – Poorna

+0

Hi Poorna,对不起,我的错。我指的是部门ID而不是用户ID。它现在按预期工作。非常感谢你Poorna :) – Rams