Mongodb 将嵌套数组字段填充为对象

时间:2021-04-27 11:42:23

标签: node.js mongodb typescript mongoose nosql

目标

我希望项目数组中的 createdBy 字段 成为一个对象(从“用户集合”中查找)并填充 firstName 和 lastName 字段。

工作区 =(包含)=> 项目

问题:如果我在项目数组的 createdBy 作为 localfield 上对用户集合运行另一个查找。它在输出的末尾添加了另一个对象。这是不对的。我希望每个项目数组条目都有自己的创建者。

预期输出

{
        "workspaceName" : "My first workspace",
        "projects" : [
                {
                        "_id" : ObjectId("60857689d2744351901ada70"),
                        "resources" : [ ],
                        "status" : false,
                        "createdAt" : ISODate("2021-04-25T14:02:15.159Z"),
                        "projectName" : "First project",
                        "workspace" : ObjectId("60857673d2744351901ada6e"),
                        "createdBy" : {
                                      firstName: "John", // < == to be looked up from users coll
                                      lastName: "Doe", // < == to be looked up from users coll
                        }
                        "__v" : 0
                }
        ]
}

当前输出:

{
        "workspaceName" : "My first workspace",
        "projects" : [
                {
                        "_id" : ObjectId("60857689d2744351901ada70"),
                        "resources" : [ ],
                        "status" : false,
                        "createdAt" : ISODate("2021-04-25T14:02:15.159Z"),
                        "projectName" : "First project",
                        "workspace" : ObjectId("60857673d2744351901ada6e"),
                        "createdBy" : ObjectId("607dc72f0eb1512830b44e57"), // < == here
                        "__v" : 0
                }
        ]
}

到目前为止我的查询:

db.userworks.aggregate([
    {
      $match: {
        user: ObjectId('607dc72f0eb1512830b44e57'),
        workspace: ObjectId('60857673d2744351901ada6e'),
      },
    },
    { $project: { _id: 0 } },
    {
      $lookup: {
        from: 'workspaces',
        localField: 'workspace',
        foreignField: '_id',
        as: 'workspaces',
      },
    },
    { $unwind: '$workspaces' },
    {
      $project: {
        workspaceName: '$workspaces.name',
        projects: '$workspaces.projects'
      },
    },
    {
      $lookup: {
        from: 'projects',
        localField: 'projects',
        foreignField: '_id',
        as: 'projects',
      },
    }
  ]).pretty()

架构

<块引用>

用户作品集

{
    user: {
      type: mongoose.SchemaTypes.ObjectId,
      ref: 'User',
      required: true,
    },
    workspace: {
      type: mongoose.SchemaTypes.ObjectId,
      ref: 'Workspace',
      required: true,
    }
}
<块引用>

工作区组

 {
    owner: {
      type: mongoose.SchemaTypes.ObjectId,
      ref: 'User',
      required: true,
    },
    name: {
      type: String,
      required: true,
    },
    projects: [
      {
        type: mongoose.SchemaTypes.ObjectId,
        ref: 'Project',
        default: [],
      },
   ],
}
<块引用>

用户

{
    firstName: { type: String, required: true },
    lastName: { type: String, required: true },
}

0 个答案:

没有答案