MongoDB 聚合 - 如何检查特定字段值是否存在于文档数组中

MongoDB Aggregate - How to check if a specific field value exists in array of documents

我有这个 LikeSchema 用于 Posts,我想要实现的是检查用户 id 是否存在于 Likes Document 的 _user_id[=24 数组中=]

假设我有这个 Likes 文档数组

[
  {
    id: 'a',
    _user_id: 'u1',
    _post_id: 'p1'
  },
  {
    id: 'b',
    _user_id: 'u2',
    _post_id: 'p1'
  }
]

如何使用聚合检查 likes 数组文档中是否存在用户 ID u1

我有这个 Like 架构

const LikeSchema = new Schema({
    _post_id: {
        type: Schema.Types.ObjectId,
        ref: 'Post',
        required: true
    },
    _user_id: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
})

还有我的聚合

const result = await Post.aggregate([
  {
    $match: { privacy: 'public' }
  }, 
  {
    $lookup: {
      from: 'likes',
      localField: '_id',
      foreignField: '_post_id',
      as: 'likes'
    }
  },
  {
     $addFields: {
        isLiked: {
          $in: [req.user._id, '$likes'] // WONT WORK SINCE I STILL HAVE TO MAP AS ARRAY OF _user_id
        }
     }  
   }
])

我想到的解决方案是首先将数组映射为只有用户 ID 值,然后执行 $in 表达式。 我如何在聚合阶段从 lookup 映射 likes 数组,以便它只包含用户 ID 值的数组来使 $in 表达式匹配?或者也许有更好的方法来检查对象数组中存在的值?

终于找到答案了。 原来,聚合中存在一个 $map 运算符。我是这样用的

const result = await Post.aggregate([
  {
    $match: { privacy: 'public' }
  }, 
  {
    $lookup: {
      from: 'likes',
      localField: '_id',
      foreignField: '_post_id',
      as: 'likes'
    }
  }, 
  {
    $addFields: {
       likeIDs: { // map out array of like id's
         $map: {
           input: "$likes",
           as: "postLike",
           in: '$$postLike._id'
         }
       }
    }
  },
  {
     $addFields: {
        isLiked: {
          $in: [req.user._id, '$likeIDs'] // it works now
        }
     }  
   }
])