如何在MongoDB聚合管道中删除不符合过滤条件的结果?

时间:2020-12-29 16:06:39

标签: javascript mongodb mongoose aggregation-framework

我在两个集合上使用聚合 - 其中一个是嵌套的。该集合如下所示:

[
  {
    "_id": "5fe72f0b4fd2c131bcc7dae0",
    "sirname": "Smith",
    "district": "Texas",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca504c",
        "group": "Dogs"
      }
    ]
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dadf",
    "sirname": "Johnson",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca504b",
        "group": "Cats"
      }
    ]
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dade",
    "sirname": "MacGruber",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca504a",
        "group": "Dogs"
      }
    ]
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dadd",
    "sirname": "Plissken",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca5049",
        "group": "Cats"
      }
    ]
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dadc",
    "sirname": "Williams",
    "district": "Texas",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca5048",
        "group": "Dogs"
      }
    ]
  }
]

查询代码如下:

db.collection.aggregate([
  {
    "$match": {
      district: "Washington"
    }
  },
  {
    $project: {
      sirname: 1,
      district: 1,
      events: {
        "$filter": {
          input: "$events",
          as: "event",
          cond: {
            "$eq": [
              "$$event.group",
              "Cats"
            ]
          }
        }
      }
    }
  }
])

结果是这样的数组:

[
  {
    "_id": "5fe72f0b4fd2c131bcc7dadf",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca504b",
        "group": "Cats"
      }
    ],
    "sirname": "Johnson"
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dade",
    "district": "Washington",
    "events": [],
    "sirname": "MacGruber"
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dadd",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca5049",
        "group": "Cats"
      }
    ],
    "sirname": "Plissken"
  }
]

我的问题是如何从结果中排除不满足 $filter 条件的对象。也就是说,我想要这样的结果:

[
  {
    "_id": "5fe72f0b4fd2c131bcc7dadf",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca504b",
        "group": "Cats"
      }
    ],
    "sirname": "Johnson"
  },
  {
    "_id": "5fe72f0b4fd2c131bcc7dadd",
    "district": "Washington",
    "events": [
      {
        "_id": "5fe73e91ede45b3d2eca5049",
        "group": "Cats"
      }
    ],
    "sirname": "Plissken"
  }
]

另外,我在 mongo playground 分享了代码。

问候!

1 个答案:

答案 0 :(得分:1)

你可以用这个来测试:

                    BNP.PA.Adjusted   ACA.PA.Adjusted   UG.PA.Adjusted
BNP.PA.Adjusted     0.010129967x0.3   0.009577789x0.2   0.007148473x0.5
ACA.PA.Adjusted     0.009577789x0.3   0.012127668x0.2   0.007340544x0.5
UG.PA.Adjusted      0.007148473x0.3   0.007340544x0.2   0.015503678x0.5