好吧,我有一个包含太多文档的集合(数百万),现在我想知道如何计算会话持续时间的平均值。
这是我的文档结构的一个例子:
{
"session" : "xyz",
"date" : {"$date" : ""Tue May 15 2018 10:35:08 GMT-0400 LT""}
}
{
"session" : "xyz",
"date" : {"$date" : ""Tue May 15 2018 12:35:08 GMT-0400 LT""}
}
{
"session" : "xyz",
"date" : {"$date" : ""Tue May 15 2018 15:35:08 GMT-0400 LT""}
}
{
"session" : "abc",
"date" : {"$date" : ""Tue May 15 2018 09:35:08 GMT-0400 LT""}
}
{
"session" : "abc",
"date" : {"$date" : ""Tue May 15 2018 11:35:08 GMT-0400 LT""}
}
我想定义一个这样的算法:
我认为首先需要使用aggregate
和$ group,但我没有经验,现在我有一个存在问题哈哈哈
由于
答案 0 :(得分:1)
只要“序列”在这里不重要,那么$min
和$max
就是正确的选择:
db.collection.aggregate([
{ "$group": {
"_id": "$session",
"minDate": { "$min": "$date" },
"maxDate": { "$max": "$date" }
}},
{ "$group": {
"_id": null,
"avg": {
"$avg": { "$subtract": [ "$maxDate", "$minDate" ] }
}
}}
])
初始$group
从提供的“分组键”中获取$min
和$max
值,这是文档中的"session"
值。第二个$group
在没有任何分组键(或null
)的情况下完成,以便累积“所有内容”。
当你从另一个$subtract
一个BSON日期时,结果就是以毫秒为单位的差异。这也是一般将数字转换为数值的处理方式。但您所做的只是$subtract
从$min
和$max
输出的两个值,并将其输入$avg
累加器。