【问题标题】:MongoDB filling missing resultsMongoDB 填补缺失的结果
【发布时间】:2022-03-16 15:34:28
【问题描述】:

在我的聚合管道中,我可以得到以下中间文档:

{ date: "01-01-2018", value: 1 }
{ date: "04-01-2018", value: 2 }
{ date: "07-01-2018", value: 3 }

根据我拥有的数据,我可能会得到(如上所示)丢失的数据点

我的聚合管道中是否有一种方法可以为缺失的日期提供一些默认文档(或 null 等默认值)?

这样我会得到:

{ date: "01-01-2018", value: 1 }
{ date: "02-01-2018", value: null }
{ date: "03-01-2018", value: null }
{ date: "04-01-2018", value: 2 }
{ date: "05-01-2018", value: null }
{ date: "06-01-2018", value: null }
{ date: "07-01-2018", value: 3 }

也许是 $addToSet 运算符,但我怎样才能添加那些人工文档?

填补业务逻辑的空白是唯一的方法吗?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    Mongo 5.1 开始,这是新的$densify 聚合运算符的完美用例:

    // { date: ISODate("2018-01-01"), value: 1 }
    // { date: ISODate("2018-01-04"), value: 2 }
    // { date: ISODate("2018-01-07"), value: 3 }
    db.test.aggregate([
      { $densify: {
        field: "date",
        range: { step: 1, unit: "day", bounds: "full" }
      }}
    ])
    // { date: ISODate("2018-01-01"), value: 1 }
    // { date: ISODate("2018-01-02") }
    // { date: ISODate("2018-01-03") }
    // { date: ISODate("2018-01-04"), value: 2 }
    // { date: ISODate("2018-01-05") }
    // { date: ISODate("2018-01-06") }
    // { date: ISODate("2018-01-07"), value: 3 }
    

    这通过在缺少field(在我们的例子中为field: "date")的某些值的文档序列中创建新文档来增加文档($densify)的密度:

    • 我们的致密化步骤是 1 天:range: { step: 1, unit: "day", ... }
    • 并且我们在文档定义的日期范围内进行加密:bounds: "full"

    当然,要使此功能适用于您的具体示例,您可以使用$dateToString 从日期切换到字符串,然后使用$dateFromString 切换回日期。

    【讨论】:

      【解决方案2】:

      您可以使用以下查询:

      db.collection.aggregate([
       {"$addFields":{ "datefield":"$datefield"}}, 
      ])
      

      我认为如果文档中不存在该字段,这将添加空值。 但是mongo中不能添加人工文档。

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多