Mongoose:聚合获取数组类型字段的文档并根据特定字段过滤这些文档

Posted

技术标签:

【中文标题】Mongoose:聚合获取数组类型字段的文档并根据特定字段过滤这些文档【英文标题】:Mongoose: Aggregate get documents of field of type array and filter those documents based on a specific field 【发布时间】:2021-10-08 18:15:18 【问题描述】:

我有这个架构:

const UserSchema = new Schema(
  following: [
    
      type: Schema.Types.ObjectId,
      ref: "users",
    ,
  ],
  video: 
    type: Schema.Types.ObjectId,
    ref: "videos",
  ,
);
module.exports = User = mongoose.model("users", UserSchema);

我想得到:User.following WHERE following.video EXISTS

换句话说,我想获取有视频的特定用户所关注的用户列表。

这是我到目前为止所做的:

const user = await User.aggregate([
   $match:  _id: ObjectId(user_id)  ,
  
    $lookup: 
      from: "users",
      let:  following: "$following" ,
      pipeline: [ $match:  $expr:  $in: ["$_id", "$$following"]   ],
      as: "following",
    ,
  ,
]);
const followed_users = user[0].following;

但是,我找不到根据 video 字段过滤关注用户的方法。 知道如何实现这一目标吗?

【问题讨论】:

【参考方案1】:

其实我只需要这样做:

  
      $match: 
        video:  $exists: true ,
        $expr:  $in: ["$_id", "$$following"] ,
      ,
    ,

【讨论】:

以上是关于Mongoose:聚合获取数组类型字段的文档并根据特定字段过滤这些文档的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 mongoose 中嵌套 JSON 文档中数组字段的日志日期获取最新日志记录

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

Mongoose:通过聚合获取对象数组的大小

Mongoose/Node:将元素推入数组类型的文档字段?

如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?

Mongoose — 使用聚合创建具有 $sum 的新属性