简体   繁体   English

聚合框架返回空数组而不是单个 object (MongoDB/Mongoose)

[英]Aggregate framework returns empty array instead of single object (MongoDB/Mongoose)

I am building an api for a kanban task management app.我正在为看板任务管理应用程序构建 api。 I have this data stored in the database.我将这些数据存储在数据库中。

{
  "_id": "62fa5aa25778ec97bc6ee231",
  "user": "62f0eb5ebebd0f236abcaf9d",
  "name": "Marketing Plan",
  "columns": [
    {
      "name": "todo",
      "_id": "62fa5aa25778ec97bc6ee233",
      "tasks": [
        {
          "title": "Task Four testing 2",
          "description": "This is task four",
          "subtasks": [
            {
              "name": "wash dshes test",
              "completed": false,
              "_id": "62ff74bfe80b11ade2d34456"
            },
            {
              "name": "do homework",
              "completed": false,
              "_id": "62ff74bfe80b11ade2d34457"
            }
          ],
          "_id": "62ff74bfe80b11ade2d34455"
        }
      ]
    },
    {
      "name": "doing",
      "_id": "62fa5aa25778ec97bc6ee234",
      "tasks": []
    },
    {
      "name": "done",
      "_id": "62fa5aa25778ec97bc6ee235",
      "tasks": []
    }
  ],
  "__v":0
}

I tried to return a single object with the id of req.params.id which in this case is 62ff74bfe80b11ade2d34455 however, it returns an empty array instead of returning a single object.我尝试返回单个 object,其 id 为 req.params.id,在本例中为 62ff74bfe80b11ade2d34455 但是,它返回一个空数组,而不是返回单个 object。

const getTask = asyncHandler(async (req, res) => {
  const task = await Board.aggregate([
    {
      $match: {
        "columns.tasks._id": req.params.id,
      },
    },
    {
      $project: {
        columns: {
          $first: {
            $filter: {
              input: "$columns.tasks",
              cond: {
                $eq: ["$$this._id", req.params.id],
              },
            },
          },
        },
      },
    },
    {
      $replaceRoot: {
        newRoot: "$columns",
      },
    },
  ]);
});

As @yung-shun suggested, I needed to cast req.params.id as an Object ID.正如@yung-shun 建议的那样,我需要将 req.params.id 转换为 Object ID。

 const task = await Board.aggregate([
    {
      $match: {
        "columns.tasks._id": new ObjectId(req.params.id),
      },
    },
    { $unwind: "$columns" },
    {
      $match: {
        "columns.tasks._id": new ObjectId(req.params.id),
      },
    },
    {
      $project: {
        task: {
          $first: {
            $filter: {
              input: "$columns.tasks",
              cond: { $eq: ["$$this._id", new ObjectId(req.params.id)] },
            },
          },
        },
      },
    },
    { $replaceWith: "$task" },
  ]);
  res.status(200).json(task);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM