包含许多嵌入文档的MongoDB聚合

时间:2016-06-01 10:19:04

标签: mongodb mongodb-aggregation

我有mongoDB集合的下一个结构:

{
  "_id": "1",
  "sessions": [
    {
      "type": "default",
      "pageViews": [
        {
          "path": "/",
          "host": "example.com",
          "events": [
            {
              "name": "event1"
            },
            {
              "name": "event1"
            }
          ]
        }
      ]
    },
    {
      "type": "default",
      "pageViews": [
        {
          "path": "/",
          "host": "example.com",
          "events": [
            {
              "name": "event1"
            },
            {
              "name": "event1"
            }
          ]
        }
      ]
    }
  ]
}

我需要在_id字段的一个查询分组中计算会话,页面视图和事件的数量。

我做:

db.collection.aggregate([

    {
        $unwind: "$sessions"
    },

    {
        $unwind: "$sessions.pageViews"
    },

    {
        $group: {
            _id : "$_id",
            totalEvents: {
                $sum: {
                    $size: "$sessions.pageViews.events"
                },
            },
            totalPageViews: {
                $sum: 1
            }
        }
    }

])

但我无法理解如何计算会话次数。

如何在此查询中获取会话数?

谢谢!

1 个答案:

答案 0 :(得分:2)

在使用$ project(在mongodb 3.2中提供)展开之前尝试计算会话数。然后,总会话将在$group阶段提供。您可以为每个_id取$first个totalSessions,因为具有相同_id的所有记录将具有相同的会话数:

db.collection.aggregate([

    { $project : { sessions: 1, totalSessions : { $size : "$sessions" } } },

    {
        $unwind: "$sessions"
    },

    {
        $unwind: "$sessions.pageViews"
    },

    {
        $group: {
            _id : "$_id",
            totalSessions: { $first : "$totalSessions" },
            totalEvents: {
                $sum: {
                    $size: "$sessions.pageViews.events"
                },
            },
            totalPageViews: {
                $sum: 1
            }
        }
    }
])