在我的数据库中,我有不同时期的活动(一天开始,另一天结束)。这是一个文档示例:
{
"activity" : "test",
"period" : [ ISODate("2020-01-01T00:00:00Z"), ISODate("2020-02-10T00:00:00Z")]
}
“期间”是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")]
}
我的目标是输出,使我能够绘制一对夫妇的图表(date,#activities),如下所示:
{
"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")
}
不幸的是,我尚未达到最终结果……可能我不是以“非常好的方式”编写查询... 我的逻辑流程如下:
因此,通过编写以下查询:
[
{ $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" }
}
}
]
我可以得到结果的清单,其中列出了活动数量发生变化的天数以及活动发生变化的数量(增量)。
可以这样输出:
{ _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 }
我应该开发哪种附加查询?
答案 0 :(得分:0)
最后,我以某种听起来很复杂的方式解决了...我认为查询太慢了。我必须保存2个具有所有delta
值的数组和一个具有所有date
的值。然后,我可以进行求和直到特定位置(由于保存在第二个$unwind
上的arrayindex)。
因此在查询插入的问题中添加了以下内容:
{
"$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 ] } ] } }
}
}