Mongodb查询 - 累积总和

问题描述 投票:0回答:1

在我的数据库中,我的活动在不同的时期进行(一天开始,另一天结束)。这是一个文档的例子。

    {
        "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")
}

不幸的是,我还没有达到最终的结果... 可能我写的查询不是以一种 "很好的方式"... 我的逻辑流程如下:

  1. 使用unwind对每个文档进行两次查询,并在内存中保存arrayindex。
  2. 设置+1-1的值,以便以后根据数组索引进行计数。
  3. 按日期对所有结果进行排序
  4. 将每天所有的文件进行分组,使数值之和(+1和-1)。
  5. 缺少的步骤。 总数应该是累计的

所以,通过写这个查询,我可以达到这样的结果:我有活动数量变化的天数列表,以及它的变化程度(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 }

我应该开发什么样的附加查询?

jquery mongodb period
1个回答
0
投票

最后我解决了一个听起来太复杂的方式... ... 我认为这个查询太慢了。我不得不保存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 ] } ] } }
 }
 }
© www.soinside.com 2019 - 2024. All rights reserved.