使用猫鼬节点js进行级联

问题描述

我正在尝试使用 Node Js 从MongoDB中获取数据。我有三种模式:项目,用户和团队。 我需要根据工作人员用户type来检索项目详细信息。 我被困在为这些架构加入

项目:

const Project = new Schema({
    projectName: { type: String,required: true,trim: true },type: { type: String,teamID: { type: Schema.Types.ObjectId,required: true },});

团队

const Team = new Schema({
    teamId: { type: Schema.Types.ObjectId,users: { type: [Schema.Types.ObjectId],teamName: { type: String,});

用户

const User = new Schema({
    userId: { type: Schema.Types.ObjectId,name: { type: String,profilePicture: { type: String,});

我正在设法找到一种方法

[
   {
      projectName: "s",type: "w",users: ["Jon","Ali","Mark"]
   },{
      projectName: "a",{
      projectName: "s",]

我尝试使用$lookup,但由于该关系是多对多关系,因此无法使用。 是否有比检索所有用户,所有团队和所有项目更有效的方法

解决方法

我认为除了聚合,没有其他有效的方法,没有查找,我们就无法加入集合,您可以使用嵌套查找,

    $match
  • type条件
  • $lookup使用teamID
  • 加入团队收藏
  • $match teamID
  • $lookup使用users数组加入用户集合
  • $project使用$map转换用户的名称数组
  • $addFields获取使用$arrayElemAt的用户中的用户数组
db.Project.aggregate([
  { $match: { type: "w" } },{
    $lookup: {
      from: "Team",let: { teamID: "$teamID" },as: "users",pipeline: [
        { $match: { $expr: { $eq: ["$$teamID","$teamId"] } } },{
          $lookup: {
            from: "User",localField: "users",foreignField: "userId",as: "users"
          }
        },{
          $project: {
            users: {
              $map: {
                input: "$users",in: "$$this.name"
              }
            }
          }
        }
      ]
    }
  },{ $addFields: { users: { $arrayElemAt: ["$users.users",0] } } }
])

Playground


第二种可能的方法是,您可以将$project$addFields个阶段组合为一个阶段,

  {
    $addFields: {
      users: {
        $arrayElemAt: [
          {
            $map: {
              input: "$users.users",in: "$$this.name"
            }
          },0
        ]
      }
    }
  }

Playground