在 mongodb 聚合中从另一个数组中的项目过滤数组项目

Filtering array items from items in another array in mongodb aggregation

我已经设法创建了一个聚合,其中 returns 文档中的两个数组,如下所示:

"b": [
                {
                    "_id": "6258bdfe983a2d31e1cc6a4b",
                    "booking_room_id": "619395ba18984a0016caae6e",
                    "checkIn_date_time": "2022-04-16",
                    "checkOut_date_time": "2022-05-17"
                }
            ]
"r": [
                {
                    "_id": "619395ba18984a0016caae6e",
                }
            ]

如果 r 中的 _id 匹配 b 中的 booking_room_id,我想从 r 中删除该项目。

此外,由于这些数组存在于父文档中。如果 r 在执行过滤器后为空,我想从查询中删除父文档。

使用$expr$filter

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $ne: [
          {
            $filter: {
              input: "$r",
              as: "r",
              cond: {
                $not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
              }
            }
          },
          []
        ]
      }
    }
  },
  {
    $set: {
      r: {
        $filter: {
          input: "$r",
          as: "r",
          cond: {
            $not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
          }
        }
      }
    }
  }
])

mongoplayground