根据值类型和唯一访客 ID 汇总总数和唯一计数 - MongoDB

Aggregate total and unique counts based on value type and unique visitorId - MongoDB

类似于我的另一个问题 (Here)。但现在我正在尝试根据以下数据形状每天计算每种事件类型的唯一事件和总事件:

{
    username: "jack",
    events: [
     {
       eventType: "party",
       createdAt: "2022-01-23T10:26:11.214Z",
       visitorInfo: {
            visitorId: "87654321-0ebb-4238-8bf7-87654321"
           }
     },
     {
       eventType: "party",
       createdAt: "2022-01-23T10:26:11.214Z",
       visitorInfo: {
            visitorId: "87654321-0ebb-4238-8bf7-87654321"
           }
     },
     {
       eventType: "party",
       createdAt: "2022-01-23T10:26:11.214Z",
       visitorInfo: {
            visitorId: "01234567-0ebb-4238-8bf7-01234567"
           }
     },
    {
       eventType: "meeting",
       createdAt: "2022-01-23T12:26:11.214Z",
       visitorInfo: {
            visitorId: "87654321-0ebb-4238-8bf7-87654321"
           }
     },
     {
       eventType: "meeting",
       createdAt: "2022-01-23T11:26:11.214Z",
       visitorInfo: {
            visitorId: "87654321-0ebb-4238-8bf7-87654321"
           }
     },
     {
       eventType: "meeting",
       createdAt: "2022-01-23T12:26:11.214Z",
       visitorInfo: {
            visitorId: "01234567-0ebb-4238-8bf7-01234567"
           }
     },
     {
       eventType: "party",
       createdAt: "2022-01-30T10:26:11.214Z",
       visitorInfo: {
            visitorId: "12345678-0ebb-4238-8bf7-12345678"
           }
     },
    {
       eventType: "party",
       createdAt: "2022-01-30T10:16:11.214Z",
       visitorInfo: {
            visitorId: "12345678-0ebb-4238-8bf7-12345678"
           }
     },
    {
       eventType: "meeting",
       createdAt: "2022-01-30T12:36:11.224Z",
       visitorInfo: {
            visitorId: "12345678-0ebb-4238-8bf7-12345678"
           }
     },
    {
       eventType: "meeting",
       createdAt: "2022-01-30T11:46:11.314Z",
       visitorInfo: {
            visitorId: "12345678-0ebb-4238-8bf7-12345678"
           }
     }
       ]

    }

我正在尝试按日期(每天)计算事件(所有事件和基于 visitorId 的唯一事件)。 这是我目前所拥有的(感谢@R2D2 的方法指南):

 Event.aggregate([
  { $match: { username: 'jack' } },

  { $unwind: "$events" },

  {
    $project: {
      totalPartyEvents: {
        $cond: [
          {
            $eq: ["$events.eventType", "party"],
          },
          1,
          0,
        ],
      },

    uniquePartyEvents: { // where I'm stuck. I need to count unique events based on visitorId on current date for 'party' event type.
        $cond: [
          {
            $eq: ["$events.eventType", "party"],
          },
          1,
          0,
        ],
      },

      totalMeetingEvents: {
        $cond: [
          {
            $eq: ["$events.eventType", "meeting"],
          },
          1,
          0,
        ],
      },

    uniqueMeetingEvents: { // do the same for other events. maybe there's a better way to combine these (with facets).
        $cond: [
          {
            $eq: ["$events.eventType", "meeting"],
          },
          1,
          0,
        ],
      },

      date: "$events.createdAt",
    },
  },

  {
    $group: {
      _id: {
        $dateToString: { format: "%Y-%m-%d", date: "$date" },
      },

      totalPartyEvents: {
        $sum: "$totalMeetingEvents",
      },
      uniquePartyEvents: {
        $sum: "$totalMeetingEvents",
      },
    
      totalMeetingEvents: {
        $sum: "$totalMeetingEvents",
      },

      uniqueMeetingEvents: {
        $sum: "$uniqueMeetingEvents",
      },
    },
  },
  {
    $project: {
      date: "$_id",
      uniquePartyEvents: 1,
      totalPartyEvents: 1,
      totalMeetingEvents:1,
      uniqueMeetingEvents: 1,

    },
  },
  {
    $group: {
      _id: "0",
      dateAndEventFrequency: {
        $push: "$$ROOT",
      },
    },
  },
  {
    $project: {
      _id: 0,
      dateAndEventFrequency: 1,
    },
  },
]);

我尝试使用 $addToSet,但它没有与 $project 一起使用(它适用于 $group)。 基于数据形状和我期望的期望结果,欢迎使用任何新方法。我使用 $project 因为我已经在使用它了。

基本上我希望得到的结果是:

dateAndEventFrequency: [
    {
    _id: "2022-01-23",
    totalPartyEvents: 3,
    uniquePartyEvents: 2,
    totalMeetingEvents: 3,
    uniqueMeetingEvents: 2,
    date: "2022-01-23",
    },
   {
    _id: "2022-01-30",
    totalPartyEvents: 2,
    uniquePartyEvents: 1,
    totalMeetingEvents: 2,
    uniqueMeetingEvents: 1,
    date: "2022-01-30",
    },
]

我正在使用 Mongoose 和 Nodejs。任何帮助或指导表示赞赏。谢谢!

mongo playground

db.collection.aggregate([
  {
    $match: {
      username: "jack"
    }
  },
  {
    "$unwind": "$events"
  },
  {
    "$match": {
      "events.eventType": {
        "$in": [
          "meeting",
          "party"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": {
        date: {
          "$dateToString": {
            format: "%Y-%m-%d",
            date: "$events.createdAt"
          }
        },
        "visitorId": "$events.visitorInfo.visitorId",
        "eventType": "$events.eventType"
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$group": {
      "_id": {
        "date": "$_id.date",
        "eventType": "$_id.eventType"
      },
      "uniqueTotal": {
        "$sum": 1
      },
      total: {
        "$sum": "$count"
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.date",
      "partyUniqueTotal": {
        "$sum": {
          "$cond": [
            {
              $eq: [
                "$_id.eventType",
                "party"
              ],
              
            },
            "$uniqueTotal",
            0
          ]
        }
      },
      "totalPartyEvents": {
        "$sum": {
          "$cond": [
            {
              $eq: [
                "$_id.eventType",
                "party"
              ],
              
            },
            "$total",
            0
          ]
        }
      },
      "meetingUniqueTotal": {
        "$sum": {
          "$cond": [
            {
              $eq: [
                "$_id.eventType",
                "meeting"
              ],
              
            },
            "$uniqueTotal",
            0
          ]
        }
      },
      "totalmeetingEvents": {
        "$sum": {
          "$cond": [
            {
              $eq: [
                "$_id.eventType",
                "meeting"
              ],
              
            },
            "$total",
            0
          ]
        }
      }
    }
  }
])