首页 > 解决方案 > 按日期从 Mongo 文档中的数组中提取

问题描述

我试图通过使用 mongo 查询比较早于 60 天的 isodate 字符串来使用值从 mongo 文档中的数组中提取,但它没有从文档中的数组中提取数据。例如,在查询运行后,下面的文档应该只在日志数组中保留作业 3,但当前所有三个都保留。

文档

{
    "_id" : "0jYHGDtEIaE3BCjBW",
    "owner" : "a",
    "logs" : [ 
        {
            "job" : "1",
            "createdAt" : "2020-01-31T05:07:09.468Z"
        }, 
        {
            "job" : "2",
            "createdAt" : "2020-01-31T05:07:11.119Z"
        },
        {
            "job" : "3",
            "createdAt" : "2021-04-01T05:07:11.119Z"
        }
    ]
}

代码

let deleteDate = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000);
    Logs.update(
      {},
      {
        $pull: {
          logs: {
            createdAt: {
              $gte: deleteDate,
            },
          },
        },
      },
      { multi: true }
    );

预期结果

{
    "_id" : "0jYHGDtEIaE3BCjBW",
    "owner" : "a",
    "logs" : [
        {
            "job" : "3",
            "createdAt" : "2021-04-01T05:07:11.119Z"
        }
      ]
}

标签: javascriptnode.jsmongodb

解决方案


很少有修复,

  • createdAt类型是集合中的字符串new Date并将返回日期类型,因此条件将始终为假,您必须在其字符串或日期的两侧更改相同的类型,
  • 对于解决方案,您可以使用toISOString()afternew Date函数将日期类型转换为字符串
  • 我认为您使用了错误的条件运算符$gte,应该是$lte

您的最终查询是,

let deleteDate = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString();
Logs.update(
  {},
  {
    $pull: {
      logs: {
        createdAt: {
          $lte: deleteDate
        }
      }
    }
  },
  { multi: true }
);

操场


推荐阅读