通过嵌套对象id找到mongoose返回整个文档

时间:2017-05-07 14:17:17

标签: node.js mongodb express mongoose

这是我的文档结构:

{
"_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在第一个父母身上,我的代码才有效。

我该如何解决? 非常感谢

显然,展开和匹配解决方案很好但是对于猫鼬而言,你需要明确地说id是ObjectId类型。

 {$match:
{ "parent.child._id": new mongoose.Types.ObjectId(id) }
            }

found it here

1 个答案:

答案 0 :(得分:2)

基本上你可以在聚合中首先解开父节点,然后与子节点ID匹配。这将确保它只提供父对象而不是整个文档。此外,如果匹配id不需要在第一个父对象内,但它可以在父对象数组内的任何位置。它将从父数组返回require对象,该数组在其子数组中包含搜索ID。

db.project.aggregate([ 
    { $unwind : '$parent'},
    { $match : 
        { "parent.child._id" : '590dc8b17e52f139648b9b8f' } 
    } 
]);

Mongooese语法:

//mongoose

let Project = mongoose.model('project', yourProjectSchema);

Project.aggregate([ 
    { "$unwind" : '$parent'},
    { "$match" : 
        { "parent.child._id" : req.params.id } 
    } 
]);