2016-02-12 44 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