Javascript 在Mongoose中聚合时无法使用矩.js

Javascript 在Mongoose中聚合时无法使用矩.js,javascript,node.js,mongodb,date,momentjs,Javascript,Node.js,Mongodb,Date,Momentjs,我使用的聚合管道如下所示: Model.aggregate([ $project:{ expiry: moment("$date_expired").format('h')}] ,function(err,res){...}); “$date\u expired”是架构中的日期 但是,当我试图从上面的聚合中获得结果时,我得到了一个错误 FieldPath“无效日期”不以$开头 错误可能是什么?我如何解决它?您应该尝试: Model.aggregate([ $project:{

我使用的聚合管道如下所示:

Model.aggregate([
  $project:{
    expiry: moment("$date_expired").format('h')}]
,function(err,res){...});
“$date\u expired”
是架构中的日期

但是,当我试图从上面的聚合中获得结果时,我得到了一个错误
FieldPath“无效日期”不以$开头

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

您应该尝试:

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

$date_expired

是一个变量,因此不应使用“”。

这永远不会起作用
moment
是node.js代码中的一个函数,但聚合在MongoDB中运行

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

您可以整体使用$function,但您应该将mongodb升级到v4.4

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

您不能在Mongo中使用
$hour
聚合吗?是的,但我需要得到差异,因此,我也必须使用
$substract
。只是想要一个更简单的解决方案,因为我已经在我的应用程序中使用了矩。这不是一个变量。这是MongoDB结果中的一个属性。而且,它是这样写的,在属性名称之前有一个
$
。是的。是的。很明显,它抛出了未知变量错误,因为你们在函数定义中使用了角度。你不能在辩论中传递它。在调用模型时,请尝试传递更新的内容。如果您只需要“h”,则可以使用其他功能,如$dateToString,并使用format和timezon选项获取您想要的任何格式的数据。谢谢。这对我帮助很大。这应该被标记为答案