Mongo 聚合查找 $gte 6 个月前的日期,以“DD-MM-YYYY”格式存储为字符串

问题描述 投票:0回答:1

我正在尝试编写一个 mongo 聚合,它返回过去 6 个月内发送电子邮件的所有记录。

emailSentDate
字段以
DD-MM-YYYY
格式存储(令人烦恼)。

我一直在类似问题中查看这个答案,但我无法让它发挥作用。有人能帮我指出正确的方向吗?

到目前为止我所拥有的:

蒙戈数据 数据以这种格式存储。显然还有很多字段我省略了,因为它们不相关。

{
    "admin": {
        "emailSentDate": "11-06-2023"
    },
    "data": {
      // More data here
    }

}

到目前为止我的代码

const now = new Date();
const sixMonthsAgoDate = now.setMonth(now.getMonth() - 6);


const data = await MyModel.aggregate(
[
      {
        $addFields: {
          "admin.emailSentDate" : {$dateFromString: {dateString: "$admin.emailSentDate", format: "%d-%m-%Y"}}
        }
      },
      {
        $match: {"admin.emailSentDate": {$gte: sixMonthsAgoDate} }
      }
    ]
)

我没有得到任何数据,只是一个空数组。有人能看到我在这里做错了什么吗?

谢谢

mongodb mongodb-query aggregation-framework
1个回答
0
投票

一个选项是:

db.collection.find({
  $expr: {$gte: [
      {$dateFromString: {
          dateString: "$admin.emailSentDate",
          format: "%d-%m-%Y"
      }},
      {$dateSubtract: {
          startDate: "$$NOW",
          unit: "month",
          amount: 6
      }}
  ]}
})

查看它在 playground 示例中的工作原理

© www.soinside.com 2019 - 2024. All rights reserved.