在我的数据库中,我的活动在不同的时期进行(一天开始,另一天结束)。这是一个文档的例子。
{
"activity" : "test",
"period" : [ ISODate("2020-01-01T00:00:00Z"), ISODate("2020-02-10T00:00:00Z")]
}
"期间 "是一个由2个元素组成的数组,第一个是开始时间,第二个是结束时间。
我想写一个查询,在输出中给出该时间内的活动次数。
为了更好的理解,考虑这2个活动。
{
"activity" : "first_activity",
"period" : [ ISODate("2020-01-01T00:00:00Z"),ISODate("2020-02-10T00:00:00Z")]
},
{
"activity" : "second_activity",
"period" : [ ISODate("2020-01-13T00:00:00Z"), ISODate("2020-01-26T00:00:00Z")]
}
我的目标是输出一个可以让我画出夫妻关系图(日期 ,#活动),就像这样。
{
"quantity" : 1,
"date" : ISODate("2020-01-01T00:00:00Z")
},
{
"quantity" : 2,
"date" : ISODate("2020-01-13T00:00:00Z")
},
{
"quantity" : 1,
"date" : ISODate("2020-01-26T00:00:00Z")
},
{
"quantity" : 0,
"date" : ISODate("2020-02-10T00:00:00Z")
}
不幸的是,我还没有达到最终的结果... 可能我写的查询不是以一种 "很好的方式"... 我的逻辑流程如下:
所以,通过写这个查询,我可以达到这样的结果:我有活动数量变化的天数列表,以及它的变化程度(delta)。
[
{ $unwind : {
path: "$period",
includeArrayIndex: "arrayIndex"
}
},
{
$project: { _id:0, date: "$period", val: { $cond: { if : { $lt: ["$arrayIndex",1] } , then: 1 , else: -1 } }}
},
{
$sort : { date : 1}
},
{
"$group":{
_id : { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
delta: { $sum: "$val" }
}
}
]
我就可以得到一个结果,其中我有活动数量变化的天数列表 以及它的变化程度(delta).
类似这样的东西可以是输出。
{ _id : "2020-09-30", delta: 3 }
{ _id : "2020-11-04", delta: -2 }
{ _id : "2020-12-01", delta: 1 }
但我的目标是有一个 "累计总和",所以结果是这样的。
{ _id : "2020-09-30", count: 3 }
{ _id : "2020-11-04", count: 1 }
{ _id : "2020-12-01", count: 2 }
我应该开发什么样的附加查询?
最后我解决了一个听起来太复杂的方式... ... 我认为这个查询太慢了。我不得不保存2个数组与所有的 delta
值和一个带有所有 date
. 然后,我可以玩做和,直到特定的位置(感谢保存在第二个 $unwind
).
所以在问题中的查询插入,我添加了以下内容。
{
"$group":{
"_id":0,
"time":{ "$push":"$_id" },
"totals":{ "$push":"$delta" }
}
},
{
"$unwind":{ "path":"$time", "includeArrayIndex":"index" }
},
{
"$project":{
"_id":0,
"time":1,
"delta":{ "$arrayElemAt":[ "$totals", "$index" ] },
"total":{ "$sum":{ "$slice":[ "$totals", { "$add":[ "$index", 1 ] } ] } }
}
}