按字段 1 聚合 Group 并计算字段 2 的总和

Aggregate Group by Field 1 and calculate the sum of Field 2

我有这个猫鼬查询:

const getMinutesSpentStudyingByUserById = function getMinutesSpentStudyingByUserById(
  userId
) {
  const minutesSpentStudyingWithUserPromise = MinutesSpentStudying.aggregate([
    { $match: { connected_user_id: ObjectId(userId) } },
    {
      $project: {
        minutes_spent_studying: 1,
        week: { $week: "$date" },
      },
    },
  ]);
  return minutesSpentStudyingWithUserPromise;
};

它returns这个:

 [
    {
        "_id": "5fe765765327cc0017c924cc",
        "minutes_spent_studying": 1,
        "week": 51
    },
    {
        "_id": "5fe8461f247ff100177fde30",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fe8467e247ff100177fde31",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fe85a1d2eca030017c894bf",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fe85a212eca030017c894c0",
        "minutes_spent_studying": 0,
        "week": 52
    },
    {
        "_id": "5fe85a222eca030017c894c1",
        "minutes_spent_studying": 0,
        "week": 52
    },
    {
        "_id": "5fe85a242eca030017c894c2",
        "minutes_spent_studying": 0,
        "week": 52
    },
    {
        "_id": "5feda157268ac9001796806e",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5feda814f6729c001706460a",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fedb14d055a010017cfc1e7",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fedb38e055a010017cfc1e8",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5fedb422055a010017cfc1e9",
        "minutes_spent_studying": 1,
        "week": 52
    },
    {
        "_id": "5ff023ed90d6ee0017adb9b7",
        "minutes_spent_studying": 1,
        "week": 0
    },
    {
        "_id": "5ff0244590d6ee0017adb9b8",
        "minutes_spent_studying": 1,
        "week": 0
    },
    {
        "_id": "5ff0271d90d6ee0017adb9b9",
        "minutes_spent_studying": 4,
        "week": 0
    },
    {
        "_id": "5ff028f190d6ee0017adb9ba",
        "minutes_spent_studying": 3,
        "week": 0
    },
    {
        "_id": "5ff029b090d6ee0017adb9bb",
        "minutes_spent_studying": 2,
        "week": 0
    },
    {
        "_id": "5ff16ffbb2e3980017fa8875",
        "minutes_spent_studying": 1,
        "week": 1
    },
    {
        "_id": "5ffec8aa7757ce00171a3b2d",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffec92f7757ce00171a3b2e",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffeca267757ce00171a3b2f",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffeca797757ce00171a3b30",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffed5cc7757ce00171a3b32",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffed6587757ce00171a3b33",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffed6a57757ce00171a3b34",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffeeab7028e53568243c5f0",
        "minutes_spent_studying": 2,
        "week": 2
    },
    {
        "_id": "5ffeeb3b028e53568243c5f1",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffeebc5028e53568243c5f2",
        "minutes_spent_studying": 2,
        "week": 2
    },
    {
        "_id": "5ffeec50028e53568243c5f3",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5ffeecbb028e53568243c5f4",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "5fffffc6f8f7231671373796",
        "minutes_spent_studying": 3,
        "week": 2
    },
    {
        "_id": "6000013cf8f7231671373797",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "6000044eff6b480017ba1e42",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "600004bfff6b480017ba1e43",
        "minutes_spent_studying": 1,
        "week": 2
    },
    {
        "_id": "60003249417f7860848d8093",
        "minutes_spent_studying": 18,
        "week": 2
    }
]

我想知道每周学习的分钟数。
所以我必须 按周分组并按 minutes_spent_studying.

计算总和

我已经设法按周分组,但我无法按 minutes_spent_studying 计算总和:

const getMinutesSpentStudyingByUserById = function getMinutesSpentStudyingByUserById(
  userId
) {
  const minutesSpentStudyingWithUserPromise = MinutesSpentStudying.aggregate([
    { $match: { connected_user_id: ObjectId(userId) } },
    {
      $project: {
        minutes_spent_studying: 1,
        week: { $week: "$date" },
      },
    },
    {
      $group: {
        _id: "$week",
        count: { $sum: 1 },
      },
    },
  ]);

  return minutesSpentStudyingWithUserPromise;
};

结果是:

[
    {
        "_id": 2,
        "count": 17
    },
    {
        "_id": 52,
        "count": 11
    },
    {
        "_id": 1,
        "count": 1
    },
    {
        "_id": 51,
        "count": 1
    },
    {
        "_id": 0,
        "count": 5
    }
]

我找不到计算每周 minutes_spent_studying 总和的方法。

您还可以使用 $sum 并引用另一个字段,这将 return 每组的总分钟数,尝试:

{
    $group: {
        _id: "$week",
        count: { $sum: 1 },
        total_minutes: { $sum: "$minutes_spent_studying" },
    }
}

Mongo Playground