0

我有以下架构:

Customer ID
Location Name
Time of Visit

以上存储了所有客户在不同地点的访问信息。

我想知道是否有办法在 MongoDB 中编写聚合查询,以便它按一天中的不同部分、每个位置每天提供总访客信息。

当天的部分:

编辑:

12 am  -  8 am
8 am   -  11 am
11 am  -  1 pm
1 pm   -  4 pm
4 pm   -  8 pm
8 pm   -  12 pm

如果客户在同一天同一时段多次访问某个地点,则应仅计算一次。但是,如果该客户在同一天访问了一个位置,但在一天中的不同时段访问,则对于他出现在一天中的每个时段,都应准确计算一次。

例子:

Customer 1 visits store A on day 1 at 9:30 AM
Customer 1 visits store A on day 1 at 10:30 PM
Customer 1 visits store B on day 2 at 9:30 AM
Customer 1 visits store B on day 2 at 11:30 AM
Customer 1 visits store B on day 2 at 2:45 PM

Customer 2 visits store A on day 1 at 9:45 AM
Customer 2 visits store B on day 1 at 11:00 AM
Customer 2 visits store B on day 2 at 9:45 AM

重复访问的最终输出:

Store B, Day 1, Section (00:00 - 08:00) : 0 Visitors
Store B, Day 1, Section (08:00 - 16:00) : 2 Visitors
Store B, Day 1, Section (16:00 - 24:00) : 1 Visitors
Store B, Day 2, Section (00:00 - 08:00) : 0 Visitors
Store B, Day 2, Section (08:00 - 16:00) : 2 Visitors
Store B, Day 2, Section (16:00 - 24:00) : 0 Visitors

有没有什么办法可以使用 MongoDB 的聚合框架来完成上述类型的查询?

4

1 回答 1

1

是的,这可以很简单地完成。它与我在上一个问题的答案中描述的查询非常相似,但不是按天聚合,而是需要按天-小时-组合进行聚合。

首先,而不是做一个小组,您需要投影一个新的日期部分,您需要将您的“访问时间”字段转换为适当的小时表。让我们看一种方法:

{$project : { newDate: {
                  y:{$year:"$tov"}, m:{$month:"$tov"}, d:{$dayOfMonth:"$tov"}, 
                  h: { $subtract : 
                          [ { $hour : "$tov" }, 
                            { $mod : [ { $hour : "$tov" }, 8 ] } 
                          ] 
                     }
             },
             customerId:1, locationId:1 
           }
}

如您所见,这会生成年、月、日和小时,但小时会被截断为 mod 8(因此您会得到 0、8(am) 或 16 aka 4pm。

接下来我们可以执行与之前相同的步骤,但现在我们正在聚合到不同级别的时间粒度。

还有其他方法可以实现相同的目标,您可以在我的博客上看到一些日期操作的示例。

于 2013-05-15T06:04:42.050 回答