【问题标题】:get difference between two dates in $project获取 $project 中两个日期之间的差异
【发布时间】:2022-01-05 10:44:34
【问题描述】:

试图预测两个日期之间的日期差异,但出现错误 -

$project :: 无效,由 :: 未知表达式 $dateDiff 引起

db.books.aggregate([{
$project:{
  Date_diff: 
    {$dateDiff:{
      start_dt:'$borrowers_list.borrowed_dt',
      endDate:'$borrowers_list.return_dt',
      unit: "day"
    }
  }
}
}])

json文档结构是这样的-

_id:6188a5283543f7cc2f77c73f
branch_id:1
    borrowers_list:Object    
        0:Object
            borrowed_dt:2021-08-15T06:00:00.000+00:00
            card_no:"ID000067"
            return_dt:2021-08-25T06:00:00.000+00:00

我不知道为什么错误是未知表达式 $dateDiff,因为我的语法是正确的。有人有什么建议吗?

【问题讨论】:

  • 你的borrowers_list是对象还是数组?
  • 还要检查你的 mongodb 版本,你需要 mongodb 5 for datefiff
  • @Takis_,我的版本是 4.4。我认为这就是问题所在。
  • 如果您不能使用 mongodb 5,您可以使用减法获取日期差异(以毫秒为单位),然后除以获取日期与 24*60*60 * 1000
  • @Takis_ 是的,这行得通。谢谢。

标签: json mongodb aggregation-framework projection


【解决方案1】:

根据您提供的 JSON 文档,该文档应如下所示(如果不正确,请纠正我):

  {
    _id: ObjectId("6188a5283543f7cc2f77c73f"),
    branch_id: 1,
    borrowers_list: {
      0: {
        borrowed_dt: ISODate("2021-08-15T06:00:00.000+00:00"),
        card_no: "ID000067",
        return_dt: ISODate("2021-08-25T06:00:00.000+00:00")
      }
    }
  }
]

$dateFiff字段中没有start_dt,是startDate

查询

db.collection.aggregate([
  {
    $project: {
      Date_diff: {
        $dateDiff: {
          startDate: "$borrowers_list.0.borrowed_dt",
          endDate: "$borrowers_list.0.return_dt",
          unit: "day"
        }
      }
    }
  }
])

注意:以上查询将对borrowers_list 中的第一个文档执行$dateDiff

Sample Mongo Playground


如果您需要迭代borrowers_list 中的每个文档(带有键值对)以执行$dateDiff

  1. $set - 将 borrowers_list 从对象转换为数组(通过 $objectToArray)到新字段 borrowers
  2. $set - 迭代 borrowers 数组 (1) 中的每个文档并执行 $dateDiff
  3. $project - 装饰输出文档,将Date_diff 从数组转换为对象(通过$objectToArray)。

查询

db.collection.aggregate([
  {
    $set: {
      borrowers: {
        "$objectToArray": "$borrowers_list"
      }
    }
  },
  {
    $set: {
      Date_diff: {
        $map: {
          input: "$borrowers",
          as: "b",
          in: {
            k: "$$b.k",
            v: {
              $dateDiff: {
                startDate: "$$b.v.borrowed_dt",
                endDate: "$$b.v.return_dt",
                unit: "day"
              }
            }
          }
        }
      }
    }
  },
  {
    $project: {
      Date_diff: {
        "$arrayToObject": "$Date_diff"
      }
    }
  }
])

Sample Mongo Playground (Iterate document with key-value pair)

【讨论】:

  • 我的版本是 4.4,所以我才意识到 dateDiff 对我不起作用。但是,我仍然能够发现您的答案很有用。谢谢。
猜你喜欢
  • 2020-03-22
  • 2017-03-27
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多