-1

我正在尝试修改 .find() 中单个字段的结果以删除不必要的数据。当字段likedBy(数组)不包含 userId 时,它应该返回一个空数组。但是,当likedBy确实包含用户 ID 时,它应该返回仅包含该用户 ID 的数组,而不是所有用户 ID。

const response = await MyObject.find().lean({
    "likedBy": {
        "$elemMatch": {
            "$eq": body.userId
        }
    },
});

userId = 'id-1' 时的当前响应:

{
    "_id": "some id",
    "...rest of the fields"
    "likedBy": [
        "id-1",
        "id-2",
        "id-3",
    ]
},

我想要的是:

{
    "_id": "some id",
    "...rest of the fields"
    "likedBy": [
        "id-1",
    ]
},
4

1 回答 1

0

您可以定义一个aggregate管道并用于$filter仅返回匹配的数组元素:

YourModel.aggregate([
  {
    $match: {
      "likedBy": body.userId
    }
  },
  {
    $project: {
      likedBy: {
        $filter: {
          input: "$likedBy",
          as: "likedBy",
          cond: {
            $eq: [
              "$$likedBy",
               body.userId
            ]
          }
        }
      },
      otherField: 1         
    }
  }
])

这是mongoplayground上的一个示例。

于 2020-11-11T20:06:57.553 回答