我正在试着写一个mongo聚合,它返回在过go 6个月内发送邮箱的所有记录.emailSentDate字段以DD-MM-YYYY格式存储(令人讨厌).

我一直在看一个类似问题的this answer分,但我不能让它起作用.有谁能帮我指出正确的方向吗?

到目前为止,我所拥有的是:

Mongo Data个 数据以这种格式存储.很明显,我忽略了更多的字段,因为它们不相关.

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

}

My code so far

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} }
      }
    ]
)

我没有拿回任何数据,只有一个空array.有没有人看到我做错了什么?

编辑:我使用的是Mongo版本4.13.0,不能像其中一个答案中建议的那样使用$dateSubtract.

谢谢

推荐答案

一种 Select 是在查询内执行所有操作,而不对js进行日期操作.您还可以使用find而不是聚合管道:

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

看看它在playground example号公路上是如何工作的

EDIT: 对于早于5.0的MongoDB版本,问题中建议的方法应该有效.见playground example

Mongodb相关问答推荐

Mongodb如果数组中有外部键,则将排序应用到查找结果

MongoDB通过查找具有多个数组的对象进行聚合

当日期和时间在不同键的字符串中时,Mongo 查询过滤今天的数据

无法通过管理邮箱/密码身份验证注册/登录新用户帐户(类型错误:加载失败)

在延迟函数中重用 context.WithTimeout

解析命令行时出错:unrecognized option --rest

Meteor 中的平均聚合查询

如何使用 mongoexport 导出排序数据?

Golang/mgo:如何让 MongoDB 在字段中使用当前时间?

mongoose递归填充

Spring Mongodb @DBREF

MongoDB 批处理操作的最大大小是多少?

如何在 Mongoose 中更新数组值

Ruby 按键值分组哈希

具有 AWS 云形成和自动zoom 的 Mongodb 集群

C# MongoDB 驱动程序 - 如何使用 UpdateDefinitionBuilder?

Mongodb错误:The positional operator did not find the match needed from the query

处理Mongodb连接的正确方法是什么?

如何在mongoDB中检索其值以特定字符结尾的文档

如何在 Ubuntu 10.04 中使用 --auth 选项重新启动 mongodb?