【问题标题】:Mongo query Distinct with Sum is not workingMongo 查询 Distinct with Sum 不起作用
【发布时间】:2018-11-08 05:20:15
【问题描述】:

在这里我更新了我的问题。 这是输入数据,您可以使用此命令插入本地数据库:

db.pms_teamleadtimesheets.insertMany( [
      { "Text" : "Analysis",
    "Comments" : "4",
    "TaskType" : "DELIVERY",
    "Items" : "Others",
    "StartDate" : "28-05-2018",
    "EndDate" : "2018-05-28",
    "Hours" : 240,
    "phase" : "Analysis",
    "ProjectID" : "5a042ba02af18ac8388bd3c0",
    "UserName" : "Admin",
    "FacilityID" : "59a53f0c6077b2a029c52b7f",
    "TaskID" : "5b0baafffb8df2401af90fea",
    "TaskDescription" : "Analysis",
    "IsBillable" : true
     },
      {  "Text" : "Analysis",
    "Comments" : "8",
    "TaskType" : "DELIVERY",
    "Items" : "Others",
    "StartDate" : "28-05-2018",
    "EndDate" : "2018-05-28",
    "Hours" : 240,
    "phase" : "Analysis",
    "ProjectID" : "5a042ba02af18ac8388bd3c0",
    "UserName" : "Admin",
    "FacilityID" : "59a53f0c6077b2a029c52b7f",
    "TaskID" : "5b0baafffb8df2401af90fea",
    "TaskDescription" : "Analysis",
    "IsBillable" : true
   },
      {"Text" : "Analysis",
    "Comments" : "2",
    "TaskType" : "DELIVERY",
    "Items" : "CRI",
    "StartDate" : "29-05-2018",
    "EndDate" : "2018-05-29",
    "Hours" : 120,
    "phase" : "Analysis",
    "ProjectID" : "5a042ba02af18ac8388bd3c0",
    "UserName" : "Admin",
    "FacilityID" : "59a53f0c6077b2a029c52b7f",
    "TaskID" : "5b0baafffb8df2401af90fea",
    "TaskDescription" : "Analysis",
    "IsBillable" : true
    },
       { "Text" : "Analysis",
    "Comments" : "2",
    "TaskType" : "DELIVERY",
    "Items" : "CRI",
    "StartDate" : "29-05-2018",
    "EndDate" : "2018-05-29",
    "Hours" : 120,
    "phase" : "Analysis",
    "ProjectID" : "5a042ba02af18ac8388bd3c0",
    "UserName" : "Admin",
    "FacilityID" : "59a53f0c6077b2a029c52b7f",
    "TaskID" : "5b0baafffb8df2401af90fea",
    "TaskDescription" : "Analysis",
    "IsBillable" : true }
   ] );

从这个集合中,我想做区分和求和。这里 distinct 工作正常,但总和不起作用。

这是我使用的查询:

db.Collection.aggregate([
        //where query
        { "$match": { UserName: "USER",FacilityID:"FID",ProjectID:"ID" } },
        //distinct column 
        { "$group": { _id: { ProjectID: "$ProjectID", Task: "$Text", Phase: "$phase", Comments: "$Comments", TaskType: "$TaskType", Items: "$Items", UserName: "$UserName", IsBillable: "$IsBillable", Date: "$StartDate", Hours:{$sum:"$Hours" } }} },
        //provide column name for the output
        { "$project": { _id: 0, ProjectID: "$_id.ProjectID" ,Phase: "$_id.Phase",Task: "$_id.Task",Comments: "$_id.Comments",TaskType: "$_id.TaskType",Items: "$_id.Items",UserName: "$_id.UserName",IsBillable: "$_id.IsBillable",Date: "$_id.Date",Hours:  { $divide: [ "$_id.Hours", 60 ] } } }
    ]);

我得到这样的结果。它不计算值的总和。

此处未添加总小时数。它应该返回 4,但这里返回 2。

谁能帮我解决这个问题?

【问题讨论】:

  • 请发布收集样本而不是截图
  • @Ashish,我已经更新了我的问题
  • 第一个返回 2,第二个和第三个返回 4...见这里mongoplayground.net/p/tIHcNPCz4c5
  • 请同时发布示例输出
  • accumulator 和 id 是两个独立的键值对。试试{ "$group": { _id: { ProjectID: "$ProjectID", Task: "$Text", Phase: "$phase", Comments: "$Comments", TaskType: "$TaskType", Items: "$Items", UserName: "$UserName", IsBillable: "$IsBillable", Date: "$StartDate" }, Hours:{$sum:"$Hours" } }}, { "$project": { _id: 0, ProjectID: "$_id.ProjectID" ,Phase: "$_id.Phase",Task: "$_id.Task",Comments: "$_id.Comments",TaskType: "$_id.TaskType",Items: "$_id.Items",UserName: "$_id.UserName",IsBillable: "$_id.IsBillable",Date: "$_id.Date",Hours: { $divide: [ "$Hours", 60 ] } } }

标签: mongodb mongoose mongodb-query


【解决方案1】:

$group阶段的原型形式如下:

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }

你的 field1 是 Hours 并且 accumulator1 是 sum, 因此你的聚合应该是这样的:

db.pms_teamleadtimesheets.aggregate(

  // Pipeline
  [
    // Stage 1
    {
      $match: {
      UserName:"Admin",
      FacilityID:"59a53f0c6077b2a029c52b7f",
      ProjectID:"5a042ba02af18ac8388bd3c0"
      }
    },

    // Stage 2
    {
      $group: {
         _id: { ProjectID: "$ProjectID",
            Task: "$Text", Phase: "$phase",
            Comments: "$Comments", 
            TaskType: "$TaskType", 
            Items: "$Items", 
            UserName: "$UserName", 
            IsBillable: "$IsBillable", 
            Date: "$StartDate"
            },
            Hours:{$sum:"$Hours" }
      }
    },

    // Stage 3
    {
      $project: {
       _id: 0,
       ProjectID: "$_id.ProjectID", 
       Phase: "$_id.Phase",
       Task: "$_id.Task",
       Comments: "$_id.Comments",
       TaskType: "$_id.TaskType",
       Items: "$_id.Items",
       UserName: "$_id.UserName",
       IsBillable: "$_id.IsBillable",
       Date: "$_id.Date",
       Hours:  { 
         $divide: [ "$Hours", 60 ] 
         } 
      }
    },

  ]
);

给定测试数据的输出:

{ 
    "ProjectID" : "5a042ba02af18ac8388bd3c0", 
    "Phase" : "Analysis", 
    "Task" : "Analysis", 
    "Comments" : "2", 
    "TaskType" : "DELIVERY", 
    "Items" : "CRI", 
    "UserName" : "Admin", 
    "IsBillable" : true, 
    "Date" : "29-05-2018", 
    "Hours" : 4.0
}
{ 
    "ProjectID" : "5a042ba02af18ac8388bd3c0", 
    "Phase" : "Analysis", 
    "Task" : "Analysis", 
    "Comments" : "8", 
    "TaskType" : "DELIVERY", 
    "Items" : "Others", 
    "UserName" : "Admin", 
    "IsBillable" : true, 
    "Date" : "28-05-2018", 
    "Hours" : 4.0
}
{ 
    "ProjectID" : "5a042ba02af18ac8388bd3c0", 
    "Phase" : "Analysis", 
    "Task" : "Analysis", 
    "Comments" : "4", 
    "TaskType" : "DELIVERY", 
    "Items" : "Others", 
    "UserName" : "Admin", 
    "IsBillable" : true, 
    "Date" : "28-05-2018", 
    "Hours" : 4.0
}

进一步阅读here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2021-07-04
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多