【问题标题】:Unable to use moment.js when aggregating in Mongoose在 Mongoose 中聚合时无法使用 moment.js
【发布时间】:2016-10-20 00:18:11
【问题描述】:

我正在使用这样的聚合管道:

Model.aggregate([
  $project:{
    expiry: moment("$date_expired").format('h')}]
,function(err,res){...});

"$date_expired" 是架构中的日期。

但是,当我尝试从上述聚合中获取结果时,出现错误 FieldPath \'Invalid date\' doesn\'t start with $

可能是什么错误,我该如何解决?

【问题讨论】:

标签: javascript node.js mongodb date momentjs


【解决方案1】:

你可以综合使用$function,但是你应该将mongodb升级到v4.4

     Model.aggregate([
     { $addFields:{
        expiry: {
          $function:{
            body:function(date_expire){return moment(date_expired).format('h')},
           args:['$date_expire'],
           lang:"js"
        }}
     }])

【讨论】:

  • 如果您只需要 'h',您可以使用 $dateToString 等其他函数,并使用格式和时区选项来获取您想要的任何格式的数据
  • 哦,谢谢。这对我帮助很大。这应该被标记为答案
【解决方案2】:

这永远行不通。 moment 是您的 node.js 代码中的一个函数,但聚合在 MongoDB 中运行。

如果您希望它在迭代时运行moment('$fieldInYourSchema'),它不会起作用,因为时刻实际上会在调用聚合之前运行(例如,当您构建要提交到数据库的数组时)。

【讨论】:

    【解决方案3】:

    你应该试试:

    Model.aggregate([
      $project:{
        expiry: moment($date_expired).format('h')}]
    ,function(err,res){...});
    

    因为

    $date_expired
    

    是一个变量,所以你不应该使用“”。

    【讨论】:

    • 没有。它不是一个变量。它是 MongoDB 结果中的一个属性。而且,它是这样写的,在属性名称前有一个$
    • 是的。我做到了。它显然抛出了未知变量错误。
    • 当您在函数定义上使用角度时。你不能把它传递给一个论点。尝试在调用模型时传递更新的内容。
    猜你喜欢
    • 2016-11-12
    • 2021-06-16
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2018-03-10
    • 2017-05-23
    • 2020-03-22
    相关资源
    最近更新 更多