投影来自也需要求和的分组的结果

Projecting results from a grouping that also need to be summed

我正在努力解决一个具体问题,以决定是否在上周完成基础课程后冒险将一些个人项目转换为 MongoDb。我想要实现的是基于分组的数据表示,然后最终 selecting 该组的特定部分以创建一个新投影来显示我的最终结果。在目前的代码中,我们进行了分组,然后进行了子select来创建最终的数据集,我希望这可以一次完成。

示例文档

{
    "_id": {
        "$oid": "600d88b0d7016d5675cd59bd"
    },
    "DeviceId": {
        "$oid": "600d729764ea780882ac559b"
    },
    "UserId": {
        "$oid": "600b660eff59aab915985b1d"
    },
    "Date": {
        "$date": {
            "$numberLong": "1611499696095"
        }
    },
    
    "Records": [
        {
             "Count": {
                "$numberInt": "10"
            },
            "Test1": {
                "Inconclusive": null,
                "Passed": true,
                "Failed": null
            },
            "Test2": {
                "Inconclusive": null,
                "Passed": true,
                "Failed": null
            }
           
        },
    {
             "Count": {
                "$numberInt": "15"
            },
            "Test1": {
                "Inconclusive": true,
                "Passed": null,
                "Failed": null
            },
            "Test2": {
                "Inconclusive": null,
                "Passed": true,
                "Failed": null
            }
           
        },
    {
             "Count": {
                "$numberInt": "15"
            },
            "Test1": {
                "Inconclusive": true,
                "Passed": null,
                "Failed": null
            },
            "Test2": {
                "Inconclusive": null,
                "Passed": null,
                "Failed": true
            }
           
        }
    ]
}

最终,我想要得到的是尽可能接近这个;

{
    "DeviceId": "600d729764ea780882ac559b",
    "Test1Inconclusive": 30,
    "Test1Passed": 10,
    "Test1Failed": 0,
    "Test2Inconclusive": 0,
    "Test2Passed": 25,
    "Test2Failed": 15
}

到目前为止,我所获得的只是分组的数据,此时在现有代码(实体 Framework/SQL 服务器)中,我将使用 Linq 提取求和值.

[{
    $match: {
        UserId: ObjectId('600b660eff59aab915985b1d')
    }
}, {
    $unwind: {
        path: '$Records'
    }
}, {
    $group: {
        _id: {
            DeviceId: '$DeviceId',
            Test1Inconclusive: '$Records.Test1.Inconclusive',
            Test1Passed: '$Records.Test1.Passed',
            Test1Failed: '$Records.Test1.Failed',
            Test2Inconclusive: '$Records.Test2.Inconclusive',
            Test2Passed: '$Records.Test2.Passed',
            Test2Failed: '$Records.Test2.Failed',
        },
        Count: {
            $sum: '$Records.Count'
        }
    }
}, {}]

我不确定是否可以做我想做的事情,如果可以的话,在对这个分组数据执行子 select 时如何进行下一个投影步骤。甚至可能是我的方法从一开始就存在缺陷,所以请随时彻底改变它。

如果你还可以给我 MongoDb C# 语法来做同样的事情(在 MongoCollection 上)

从@turivishal 的初始版本开始,以下答案有效;

db.collection.aggregate([
  {
    $match: {
      UserId: ObjectId("600b660eff59aab915985b1d")
    }
  },
  {
    $unwind: {
      path: "$Records"
    }
  },
  {
    $group: {
      _id: "$DeviceId",
      Test1Inconclusive: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test1.Inconclusive",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Test1Passed: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test1.Passed",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Test1Failed: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test1.Failed",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Test2Inconclusive: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test2.Inconclusive",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Test2Passed: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test2.Passed",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Test2Failed: {
        $sum: {
          $cond: [
            {
              $eq: [
                "$Records.Test2.Failed",
                true
              ]
            },
            "$Records.Count",
            0
          ]
        }
      },
      Count: {
        $sum: "$Records.Count"
      }
    }
  }
])