提问人:Ope Afolabi 提问时间:8/25/2022 最后编辑:n1md7Ope Afolabi 更新时间:8/25/2022 访问量:42
如何返回单个对象(mongoose/mongoDB)
How to return single object (mongoose/mongoDB)
问:
我把这些数据存储在数据库中。
{
"_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",
},
},
]);
});
答:
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我不使用驱动程序,所以我不确定我能帮上忙。我想知道是否符合您的期望。你能记录返回的聚合游标的内容吗?或者也许你需要?我真的不知道。mongoose
node.js
res.status(200).json(task);
task
task.toArray()
1赞
Ope Afolabi
8/27/2022
我最终让它工作,你的解决方案是完美的,我只需要将 req.params.id 转换为 ObjectId。
评论