获取最近 X 天的记录

Get records of the last X days

下面的代码 return 向我提供了存在于 CollectionA 但不存在于 CollectionB 中的所有数据。 (使用 mainID 作为参考)。

  return this.aggregate([
    {
      $lookup: {
        from: 'CollectionB',
        localField: 'mainId',
        foreignField: 'mainId',
        as: 'validd',
      },
    },
    {
      $match: {
        'validd.mainId': { $exists: false },
      },
    },
  ]);

但现在我需要添加另一个 过滤器。我还需要获取字段 createdAt 大于 90 天的数据。
换句话说:生命周期超过 90 天的记录。

尝试在 $match 中使用 $gte$lte 但没有成功。

{
  $match: {
    'validd.createdAt': { $gte: moment.utc().add(-90, "days") },
  },
},

这个return没什么。

我的数据库:

{
  _id: 227dd33c5c51c79f63743da3
  mainId: 5c306562-9c87-48dd-93ca-4a118be50490
  createdAt: 2022-05-07T02:28:12.537+00:00
},
{
  _id: f3ddd33c5c51c79f63743da3
  mainId: 5c306562-9c87-48dd-93ca-4a118be50490
  createdAt: 2022-05-10T02:28:12.537+00:00
},
{
  _id: 227dd33c5c51c79f63743da3
  mainId: 5c306562-9c87-48dd-93ca-4a118be50490
  createdAt: 2022-01-01T02:28:12.537+00:00
}

我们可以忽略所有数据,只需要关注createdAt
我想保留 $lookup 逻辑,但也将过滤器添加到 return 只有 createdAt 大于 90 天的行(考虑当天/今天) .

所以按照这个逻辑,只有 last 记录应该被 returned,因为所有其他行都是在 内创建的90 天前


编辑

澄清一下。我需要 return 数据如果:

  1. collectionA 的行在 collectionB 中不存在
  2. 集合 B 中存在集合 A 的行 但是 createdAt 超过 X 天。

根据@ray

的回答试过了
  return this.aggregate([
    {
      $lookup: {
        from: 'CollectionB',
        localField: 'mainId',
        foreignField: 'mainId',
        as: 'validd',
      },
    },
    {
      $match: {
        $expr: {
          $or: [
            {
              $eq: ["$validd", []]
            },
            {
              $and: [
                {
                  $lt: [ "validd.createdAt", moment.utc().add(-interval, "days").format('YYYY-MM-DD') ]
                },
                {
                  $ne: ["validd", null]
                }
              ]
            }
          ]
        }
      },
    },
  ]);

您可以在 $match

中的 $expr 中简单地使用 $or
db.CollectionA.aggregate([
  {
    "$lookup": {
      "from": "CollectionB",
      "localField": "mainId",
      "foreignField": "mainId",
      "as": "validd"
    }
  },
  {
    "$match": {
      $expr: {
        $or: [
          {
            $eq: [
              "$validd",
              []
            ]
          },
          {
            $and: [
              {
                $ne: [
                  "$validd",
                  []
                ]
              },
              {
                $lt: [
                  "$createdAt",
                  {
                    "$dateSubtract": {
                      "startDate": "$$NOW",
                      "unit": "day",
                      "amount": 90
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
])

这里是Mongo playground供您参考。


对于MongoDB v5.0 之前的版本,您可以$subtract $$NOW 90 天* 24 小时* 60 分钟* 60 秒* 1000 毫秒= 7776000000 并与减法结果作为替代。

db.CollectionA.aggregate([
  {
    "$lookup": {
      "from": "CollectionB",
      "localField": "mainId",
      "foreignField": "mainId",
      "as": "validd"
    }
  },
  {
    "$match": {
      $expr: {
        $or: [
          {
            $eq: [
              "$validd",
              []
            ]
          },
          {
            $and: [
              {
                $ne: [
                  "$validd",
                  []
                ]
              },
              {
                $lt: [
                  "$createdAt",
                  {
                    "$subtract": [
                      "$$NOW",
                      7776000000
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
])

这里是Mongo playground供您参考。