首页 > 解决方案 > 从 mongo 中的聚合中过滤对象(过滤内部数组)

问题描述

我有一个聚合,我的目标是删除不符合条件的对象

1- 第一阶段是满足日期标准

2-之后每个值都可以有一个数组,如果内部数组中的一个值不符合日期标准(lte),我想删除整个对象

如果我可以在查找步骤中做到这一点会更好

游乐场: https ://mongoplayground.net/p/lF0UATwdDVJ

数据:应该返回 id 3,4 的对象

[
  /** given date : 2020-10-01T00:00:00Z*/
  /** should return : id: 3,4*/
  {
    "id": 1,
    "data": {
      "ref": null
    },
    "date": ISODate("2020-09-01T00:00:00Z")
  },
  {
    "id": 2,
    "data": {
      "ref": null
    },
    "date": ISODate("2021-01-20T00:00:00Z")
  },
  {
    "id": 3,
    "data": {},
    "date": ISODate("2020-09-10T00:00:00Z")
  },
  {
    "id": 4,
    "data": {
      "ref": 1
    },
    "date": ISODate("2019-08-11T00:00:00Z")
  }
]

id 1 不会被返回,因为 id 2 持有 id 1 作为 ref 并且 id 2 的日期比第一个匹配项更新

我尝试了以下聚合,但我仍然得到 id 1

db.collection.aggregate([
  {
    "$match": {
      "date": {
        "$lte": ISODate("2020-10-01T00:00:00Z")
      }
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "id",
      "foreignField": "data.ref",
      "as": "refs"
    }
  },
  {
    "$match": {
      $or: [
        {
          refs: []
        },
        {
          "refs": {
            "$elemMatch": {
              "date": {
                "$lte": ISODate("2020-10-01T00:00:00Z")
              }
            }
          }
        }
      ]
    }
  },
  {
    $sort: {
      date: 1
    }
  }
])

标签: mongodb

解决方案


推荐阅读