Node.js mongoose按嵌套对象ID查找返回整个文档
这是我的文档结构:Node.js mongoose按嵌套对象ID查找返回整个文档,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,这是我的文档结构: { "_id": "590dc8b17e52f139648b9b94", "parent": [ { "_id": "590dc8b17e52f139648b9b95", "child": [ { "_id": "590dc8b17e52f139648b9b8f" }, { "_id": "590dc8
{
"_id": "590dc8b17e52f139648b9b94",
"parent": [
{
"_id": "590dc8b17e52f139648b9b95",
"child": [
{
"_id": "590dc8b17e52f139648b9b8f"
},
{
"_id": "590dc8b17e52f139648b9b90"
}
]
},
{
"_id": "590dc8c57e52f139648b9b9b",
"child": [
{
"_id": "590dc8c57e52f139648b9b96"
}
]
}
]}
我试图只返回有关嵌套对象的信息,我正在使用它的_id查找该对象
router.get('/child/:id', (req, res) => {
Project.findOne({ 'parent.child._id': req.params.id },
(err, results) => {
if (err)
res.status(500).send(err);
res.status(200).json(results.parent[0].child.id(req.params.id));
}
)});
问题是,结果包含整个文档,其中可能包含多个父级
所以很明显,我的代码只有在已知的子id位于第一个父对象中时才起作用
我怎样才能修好它?
非常感谢
因此,显然,展开和匹配解决方案是好的,但是对于mongoose,您需要明确地说id是ObjectId类型
{$match:
{ "parent.child._id": new mongoose.Types.ObjectId(id) }
}
基本上,您可以先在聚合中$unwind父对象,然后与子id匹配。这将确保它只提供父对象,而不是整个文档。此外,如果匹配id不需要位于第一个父对象内,但可以位于父对象数组内的任何位置,则也可以。它将从其子数组中包含搜索id的父数组返回require对象
db.project.aggregate([
{ $unwind : '$parent'},
{ $match :
{ "parent.child._id" : '590dc8b17e52f139648b9b8f' }
}
]);
蒙古语语法:
//mongoose
let Project = mongoose.model('project', yourProjectSchema);
Project.aggregate([
{ "$unwind" : '$parent'},
{ "$match" :
{ "parent.child._id" : req.params.id }
}
]);
尝试使用Thank,我仍在试图理解为什么我会收到一个空数组,在我上面提到的聚合解决方案之后,您是否会收到一个空数组?另外,请确保您将我提到的静态id替换为您的需求参数是的,我尝试使用现有的硬编码id和请求参数中的实际id。此外,我还必须将db.project.aggregate更改为project.aggregate,因为我正在使用mongooseCan。您可以通过尝试上述查询和您的孩子中存在的硬编码id来签入MongoShell。\u id值?我在答案中也添加了mongoose语法。谢谢,我通过添加:new mongoose.Types.ObjectId(id)解决了这个问题