如何返回单个对象(mongoose/mongoDB)

How to return single object (mongoose/mongoDB)

提问人:Ope Afolabi 提问时间:8/25/2022 最后编辑:n1md7Ope Afolabi 更新时间:8/25/2022 访问量:42

问:

我把这些数据存储在数据库中。

{
  "_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
}

我希望能够返回 id 等于 req.params.id 的单个对象,在本例中为 62ff74bfe80b11ade2d34455。

{
  "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"
}

我研究了stackoverflow,并遇到了这个潜在的解决方案:Mongoose从实现聚合框架的嵌套数组中检索一个文档。但是当我在 postman 中测试这一点时,没有发出请求。

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",
      },
    },
  ]);
});
JavaScript 节点.js Express Mongoose

评论


答:

1赞 rickhg12hs 8/25/2022 #1

在数组中加入数组会使查询变得有点复杂,但这里有一种方法可以检索所需的数据。

db.Board.aggregate([
  {
    $match: {
      "columns.tasks._id": req.params.id
    }
  },
  {"$unwind": "$columns"},
  {
    $match: {
      "columns.tasks._id": req.params.id
    }
  },
  {
    "$project": {
      "task": {
        "$first": {
          "$filter": {
            "input": "$columns.tasks",
            "cond": {"$eq": ["$$this._id", req.params.id]}
          }
        }
      }
    }
  },
  {"$replaceWith": "$task"}
])

mongoplayground.net 上试用。[mongoplayground.net 示例使用 而不是 .]"62ff74bfe80b11ade2d34455"req.params.id

评论

0赞 Ope Afolabi 8/25/2022
嗨,谢谢你。我如何实际返回对象。我试着做这样的事情。codepen.io/gbopola/pen/qBoGadG 但它返回了一个空对象。
0赞 rickhg12hs 8/26/2022
@OpeAfolabi我不使用驱动程序,所以我不确定我能帮上忙。我想知道是否符合您的期望。你能记录返回的聚合游标的内容吗?或者也许你需要?我真的不知道。mongoosenode.jsres.status(200).json(task);tasktask.toArray()
1赞 Ope Afolabi 8/27/2022
我最终让它工作,你的解决方案是完美的,我只需要将 req.params.id 转换为 ObjectId。