【问题标题】:Find avg difference in dates stored as strings查找存储为字符串的日期的平均差异
【发布时间】:2019-06-19 23:05:52
【问题描述】:

我有一个 Mongo 数据库,并将日期存储为字符串。每个文档我都有一个名为“creationdate”的字段和一个名为“completiondate”的字段。日期格式为“YYYY-MM-dd”(例如“2011-12-18”)。即使我可以执行简单的聚合,例如greaterThan、greaterThanEqual,我也找不到日期差异,我必须找到它来计算完成日期和创建日期之间的平均天数差异。

如果可能的话,我必须使用 MongoTemplate 在 spring-boot 上编写上述查询。

我正在尝试类似的方法,但它不起作用。

Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("creationdate").gte(date1).lte(date2).andOperator(Criteria.where("completiondate").ne(""))),
                Aggregation.project("servicerequesttype").and(DateOperators.DateFromString.fromStringOf("completiondate").withFormat("%Y-%m-%d")).minus(DateOperators.DateFromString.fromStringOf("creationdate").withFormat("%Y-%m-%d")).as("diff"),
                Aggregation.group("servicerequesttype").avg("diff").as("average")
        );

date1, date2 被赋予类似“2011-01-01”的字符串

【问题讨论】:

    标签: mongodb spring-boot aggregation mongotemplate


    【解决方案1】:

    弹簧启动

    Aggregation aggregation = Aggregation.newAggregation(
                    Aggregation.match(Criteria.where("creationdate").gte(date1).lte(date2).andOperator(Criteria.where("completiondate").ne(""))),
                    Aggregation.project("servicerequesttype").and(DateOperators.DateFromString.fromStringOf("creationdate").withFormat("%Y-%m-%d")).as("creationdate").and(DateOperators.DateFromString.fromStringOf("completiondate").withFormat("%Y-%m-%d")).as("completiondate"),
                    Aggregation.project("servicerequesttype").and("completiondate").minus("creationdate").as("difference"),
                    Aggregation.group("servicerequesttype").first("servicerequesttype").as("servicerequesttype").avg("difference").as("temp"),
                    Aggregation.project("servicerequesttype").and("temp").divide(86400000).as("average")
            );
    

    【讨论】:

      【解决方案2】:

      这是你要找的吗?

      db.collection.aggregate([
        {
          $project: {
            creationdate: {
              $dateFromString: {
                dateString: "$creationdate",
                format: "%Y-%m-%d"
              }
            },
            completiondate: {
              $dateFromString: {
                dateString: "$completiondate",
                format: "%Y-%m-%d"
              }
            }
          }
        },
        {
          $project: {
            difference: {
              $subtract: [
                "$completiondate",
                "$creationdate"
              ]
            }
          }
        },
        {
          $group: {
            _id: null,
            average: {
              $avg: "$difference"
            }
          }
        },
        {
          $project: {
            _id: 0,
            dayAverage: {
              $divide: [
                "$average",
                86400000
              ]
            }
          }
        }
      ])
      

      我在这里创建了交互式演示:https://mongoplayground.net/p/wGRw12m3UbB

      希望对你有帮助:)

      【讨论】:

      • 是的,它找到了平均日期,但我无法在 spring-boot 中执行等效操作。我必须按名为“servicerequesttype”的字段进行分组,并且我有匹配标准(创建日期大于给定的字符串日期)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多