MongoDB计算每个用户的天数

时间:2017-03-13 00:37:31

标签: mongodb aggregation-framework

我正在尝试创建一个查询,用于计算用户在1个月内完成操作的次数。

这是数据格式:

[
  {
    "happened": ISODate(2017-1-1),
    "user": ObjectId(a),
    "action": ObjectId(i)
  },
  {
    "happened": ISODate(2017-1-1),
    "user": ObjectId(a),
    "action": ObjectId(i)
  }
]

我想了解用户在一段时间内完成某项操作的次数。

我已经找到了$match

{
  $match: {
    happened: { $gte: 2017-1-1, $lt: 2017-2-1 },
    action: i
  }
}

我也在试验$group位,但我无法弄清楚如何得到我想要的东西。这就是我到目前为止所做的:

{
  $group: {
    _id: {
      user: "$user",
      year: { $year: "$happened" },
      day: { $dayOfYear: "$happened" }
    },
    count: { $sum: 1 }
  }
}

我想为每个用户查看他们执行操作的天数。但我无法超越这个:

[
  {
    "_id": {
      "user": ObjectId(a),
      "year": ObjectId(2017),
      "day": ObjectId(1)
    },
    "count": 1
  },
  {
    "_id": {
      "user": ObjectId(a),
      "year": ObjectId(2017),
      "day": ObjectId(2)
    },
    "count": 1
  }
]

您可以看到我获得了每个用户的实例数,但每天也会显示。我想看看每个用户有多少天。

2 个答案:

答案 0 :(得分:1)

您可以$push将根文档发送到临时数组,$unwind并再次创建一个组,获取先前计算的天数的第一个值:

db.data.aggregate([{
    $match: {
        happened: { $gte: ISODate("2017-01-01"), $lt: ISODate("2017-02-01") },
        action: "Action1"
    }
}, {
    $group: {
        _id: {
            day: { $dayOfMonth: "$happened" }
        },
        dayCount: { $sum: 1 },
        doc: { $push: "$$ROOT" }
    }
}, {
    $unwind: "$doc"
}, {
    $group: {
        _id: "$doc.user",
        dayCount: { $first: "$dayCount" },
        actionCount: { $sum: 1 }
    }
}])

它为您提供userId,dayCount(至少执行一个操作的天数)和actionCount:

{ "_id" : "1", "dayCount" : 2, "actionCount" : 2 }
{ "_id" : "2", "dayCount" : 3, "actionCount" : 4 }

答案 1 :(得分:1)

您可以尝试以下聚合。

首先$group为每个用户提供不同的日期,然后$group$push不同的日期,$project计算日期。

{ $group: { _id: { user: "$user", day: { $dayOfMonth: "$happened" } } } },
{ $group: { _id: "_id.$user", days:{$push:"$_id.day"} } },
{ $project: { user:"$user", count: { $size: "$days" } } }
相关问题