【问题标题】:Pass mongodb aggregation variable to NodeJs将 mongodb 聚合变量传递给 NodeJs
【发布时间】:2021-07-12 03:42:08
【问题描述】:

我正在尝试根据 Nodejs 中聚合的属性在聚合中使用 $gte。

const twelveHours = 12 * 60 * 60 * 1000;
const pipeline = [
  { $addFields: { 
    twelveHoursBeforeStart: { $subtract: ['$startDate', twelveHours] } } // this works
  },
  { match: { 
    endDate: { $gte: new Date('$twelveHoursBeforeStart') }, // <- HERE pass a variable    
  },
]

我尝试了不同的解决方案,例如:

{ match: { 
  endDate: { $gte: '$twelveHoursBeforeStart' },
},

但实际上没有一个有效

【问题讨论】:

    标签: node.js mongodb aggregation


    【解决方案1】:

    $match 阶段这两种操作都可以,

    • $expr 表达式匹配聚合 $gte 运算符,第一个参数是 endDate 和第二个减法条件
    const twelveHours = 12 * 60 * 60 * 1000;
    const pipeline = [
      {
        $match: {
          $expr: {
            $gte: [
               "$endDate",
               { $subtract: ["$startDate", twelveHours] }
            ]
          }
        }
      }  
    ]
    

    Playground

    【讨论】:

    • 这在 Node 上不起作用,因为它被编译为:{ $expr: { $gte: ['$endDate', { $subtract: ['$startDate', twelveHours] }] } }, 如果与 undefined 比较,将有相同的结果。它需要一个日期对象
    • 你的收藏是字符串类型还是日期类型?
    • 只做{ match: { endDate: { $gte: { $subtract: ["$startDate", twelveHours] } } } },不一样
    • 不,它不一样,因为$subtract是一个聚合表达式运算符,我们也在访问内部startDate字段,所以我们不能在匹配条件下使用内部字段,所以这就是它的原因需要使用$expr,简单的$gte和表达式$gte有两种不同的语法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2021-08-10
    • 2021-04-10
    • 2019-11-08
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多