MongoDB 聚合 - 用另一个数组过滤数组

MongoDB Aggregation - Filter array with another array

{
  "_id": {
    "$oid": "5f8f067ecf44854d4c3b5286"
  },
  "photo": "",
  "followers": [
    {
      "$oid": "5f8f26f8cf44854d4c3b528f"
    },
    {
      "$oid": "5f9f1984cf44854d4c3b5292"
    },
    {
      "$oid": "5f8f06c9cf44854d4c3b528e"
    },
    {
      "$oid": "604b1d0649a2052e912f9c3f"
    },
    {
      "$oid": "5f8f0688cf44854d4c3b5287"
    },
    {
      "$oid": "62371c3b8fabe53cf4386b1f"
    }
  ],
  "following": [
    {
      "$oid": "5f9f1984cf44854d4c3b5292"
    },
    {
      "$oid": "5f8f26f8cf44854d4c3b528f"
    },
    {
      "$oid": "5f8f06c9cf44854d4c3b528e"
    }
  ],
  "email": "johndoe@test.com",
  "firstname": "John",
  "lastname": "Doe",
  "username": "JohnDoe01",
  "__v": 0
}

我正在尝试获取特定用户的关注者列表。我有一个被阻止用户的列表,因此我需要将这些用户从关注者列表中排除。 例如:

let blockedUsers = ['5f8f26f8cf44854d4c3b528f', '5f9f1984cf44854d4c3b5292'];

仅供参考:关注者也是用户对象

如果需要更多详细信息,请告诉我。提前致谢。

您可以使用$filter过滤不在黑名单中的关注者(id)。

执行比较时,请确保:

选项 1:阻止列表中的值强制转换为 ObjectId

选项 2:将 follower 转换为 string

必须比较相同类型的值

db.collection.aggregate({
  $set: {
    followers: {
      $filter: {
        input: "$followers",
        cond: {
          $not: {
            $in: [
              {
                $toString: "$$this"  // Or "$$this._id" for user Object
              },
              [
                "5f8f26f8cf44854d4c3b528f",
                "5f9f1984cf44854d4c3b5292"
              ]
            ]
          }
        }
      }
    }
  }
})

Sample Mongo Playground