首页 > 解决方案 > 如何在猫鼬中返回与一个特定键值相关的多个值?

问题描述

我创建了帐户和项目架构。项目架构也具有与我的帐户projectCreatorId相同的值。_id我想要的结果是,如果应用程序获取列表中的所有项目,我还想获取与projectCreatorId可以在accountModel.

projectController.js
export const getProjectList = async (req, res) => {
  try {
    projectModel
      .aggregate([
        {
          $lookup: {
            from: 'accountModel',
            localField: 'projectCreatorId',
            foreignField: '_id',
            as: 'output',
          },
        },
      ])
      .then((result) => console.log(result));
  } catch (error) {
    res.status(500).json({ msg: error.message });
  }
};

结果:

[
  {
    _id: 6124f5d1b77aab39fc8db7ba,
    lastOpened: { date: 2021-08-24T13:36:17.364Z },
    projectCreatorId: 612630b5caec270758fcbc22,
    projectName: 'Project One',
    projectNotes: '',
    startDate: 2021-08-24T13:31:20.050Z,
    endDate: 2021-08-31T13:31:20.000Z,
    whoCanEdit: 'Admin',
    viewType: 'List',
    lastUpdate: 2021-08-24T13:36:17.364Z,
    createdAt: 2021-08-24T13:36:17.364Z,
    __v: 0,
    output: []
  },
  {
    _id: 6124f71db77aab39fc8db7c5,
    lastOpened: { date: 2021-08-24T13:41:49.957Z },
    projectCreatorId: 610fa182093746447c9c399f,
    projectName: 'Project Two',
    projectNotes: '',
    startDate: 2021-08-24T13:41:36.304Z,
    endDate: 2021-08-30T13:41:36.000Z,
    whoCanEdit: 'Everyone',
    viewType: 'List',
    lastUpdate: 2021-08-24T13:41:49.957Z,
    createdAt: 2021-08-24T13:41:49.957Z,
    __v: 0,
    output: []
  },
  {
    _id: 61252481b77aab39fc8db81c,
    lastOpened: { date: 2021-08-24T16:55:29.378Z },
    projectCreatorId: 610fa182093746447c9c399f,
    projectName: 'Project Three',
    projectNotes: '',
    startDate: 2021-08-24T16:55:13.490Z,
    endDate: 2021-08-31T16:55:13.000Z,
    whoCanEdit: 'Everyone',
    viewType: 'List',
    lastUpdate: 2021-08-24T16:55:29.378Z,
    createdAt: 2021-08-24T16:55:29.378Z,
    __v: 0,
    output: []
  }
]

账户模型 在此处输入图像描述

项目模型 在此处输入图像描述

标签: node.jsmongoose

解决方案


您只需要$lookup像这样进入聚合阶段:

  • $lookup合并结果比较_idprojectCreatorId。它创建一个名为的数组result
  • 然后得到结果数组的第一个位置。
  • 并用于$project仅输出您想要的值。
db.account.aggregate([
  {
    "$lookup": {
      "from": "project",
      "localField": "_id",
      "foreignField": "projectCreatorId",
      "as": "result"
    }
  },
  {
    "$set": {
      "result": {
        "$arrayElemAt": [
          "$result",
          0
        ]
      }
    }
  },
  {
    "$project": {
      "_id":0,
      "name": 1,
      "projectName": "$result.projectName",
      "projectCreatorId": "$result.projectCreatorId"
    }
  }
])

这里的例子


推荐阅读