Mongodb使用$ elemMatch子文档分组依据的其他字段

时间:2018-10-19 18:45:53

标签: mongodb mongodb-query aggregation-framework

我需要计算每天的订阅操作数。 这是我的user_events集合:

[
    {
        "user_id": 5,
        "events": [
            {
                "date": ISODate("2018-10-17T15:51:06.000Z"),
                "action": "subscribe" 
            },
            {
                "date": ISODate("2018-10-18T15:51:06.000Z"),
                "action": "unsubscribe" 
            },
            {
                "date": ISODate("2018-10-16T15:51:06.000Z"),
                "action": "charge" 
            },
            {
                "date": ISODate("2018-10-19T15:51:06.000Z"),
                "action": "subscribe" 
            }
        ]
    },
    {
        "user_id": 6,
        "events": [
            {
                "date": ISODate("2018-10-6T15:51:06.000Z"),
                "action": "subscribe" 
            },
            {
                "date": ISODate("2018-10-17T15:51:06.000Z"),
                "action": "unsubscribe" 
            },
            {
                "date": ISODate("2018-10-10T15:51:06.000Z"),
                "action": "charge" 
            },
            {
                "date": ISODate("2018-10-26T15:51:06.000Z"),
                "action": "send-code" 
            },
            {
                "date": ISODate("2018-10-11T15:51:06.000Z"),
                "action": "charge" 
            },
            {
                "date": ISODate("2018-10-18T15:51:06.000Z"),
                "action": "subscribe" 
            }
        ]
    },
]

我需要根据订阅日期汇总数据。 因此只有带有action的子文档:subscribe应该计入查询结果中。

所以我的结果应该是:

{"2018-10-18": 2, "2018-10-06": 1, "2018-10-17":2, "2018-10-19":1}

请考虑我只希望将具有订阅操作的子文档计入我的结果。

1 个答案:

答案 0 :(得分:1)

您应该可以通过以下方式实现此目标:

db.collection.aggregate([
  {
    $project: {
      events: {
        $filter: {
          input: "$events",
          as: "event",
          cond: {
            $eq: [
              "$$event.action",
              "subscribe"
            ]
          }
        }
      }
    }
  },
  {
    $unwind: "$events"
  },
  {
    $addFields: {
      day: {
        $dateToString: {
          format: "%Y-%m-%d",
          date: "$events.date"
        }
      }
    }
  },
  {
    $group: {
      _id: "$day",
      count: {
        $sum: 1
      }
    }
  }
])

这个想法首先是在subscribe事件上$filter,之后是$unwind

然后添加日期字段(通过$addFields$dateToString),上一阶段我们将在该字段上grouping

您可以看到此working here

您还可以附加:

  {
    "$project": {
      "_id": 0,
      "day": "$_id",
      "count": "$count"
    }
  }

如果您想获得day而不是_id