如何在nodejs中使用mongoose选择mongodb中的深层嵌套数据

问题描述:

我是nodejs和mongoose的新手,我创建了一个类别文档,其中包含类别和子类别以及子类别,甚至包含子类别。现在我想选择级别3的值,我无法取得成功。如何在nodejs中使用mongoose选择mongodb中的深层嵌套数据

这里是我的类别是什么样子

[{ 
"_id": "58eb0ee37c1f817864b5b863", 
"name": "Electronics", 
"slug": "electronics", 
"order": 1, 
"__v": 0, 
"subCats": [{ 
    "name": "Mobiles", 
    "slug": "mobiles", 
    "_id": "58eb0ee37c1f817864b5b867", 
    "subCats": [{ 
     "name": "Apple", 
     "slug": "apple", 
     "_id": "58eb0ee37c1f817864b5b872", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "HTC", 
     "slug": "htc", 
     "_id": "58eb0ee37c1f817864b5b871", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Mi", 
     "slug": "mi", 
     "_id": "58eb0ee37c1f817864b5b870", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "OPPO", 
     "slug": "oppo", 
     "_id": "58eb0ee37c1f817864b5b86f", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Samsung", 
     "slug": "samsung", 
     "_id": "58eb0ee37c1f817864b5b86e", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Lenovo", 
     "slug": "lenovo", 
     "_id": "58eb0ee37c1f817864b5b86d", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Motorola", 
     "slug": "motorola", 
     "_id": "58eb0ee37c1f817864b5b86c", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "LG", 
     "slug": "lg", 
     "_id": "58eb0ee37c1f817864b5b86b", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Huawei", 
     "slug": "huawei", 
     "_id": "58eb0ee37c1f817864b5b86a", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Nokia", 
     "slug": "nokia", 
     "_id": "58eb0ee37c1f817864b5b869", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }, { 
     "name": "Microsoft", 
     "slug": "microsoft", 
     "_id": "58eb0ee37c1f817864b5b868", 
     "params": ["RAM", "Storage", "Primary Camera", "Front Camera", "Battery", "Processor", "Display Size", "Resolution", "Resolution Type", "GPU", "Operating System"] 
    }] 
}, { 
    "name": "Mobile Accessories", 
    "slug": "mobile-accessories", 
    "_id": "58eb0ee37c1f817864b5b864", 
    "subCats": [{ 
     "name": "Mobile Cases", 
     "slug": "mobile-cases", 
     "_id": "58eb0ee37c1f817864b5b866", 
     "params": ["Model", "type"] 
    }, { 
     "name": "Headphones & Headsets", 
     "slug": "headphones-headsets", 
     "_id": "58eb0ee37c1f817864b5b865", 
     "params": [] 
    }] 
}] 

在这里,我想苹果类的_id和名称,下面是我在做什么获取数据

router.get('/getparms/:cat', function (req, res, next){ 

categoriesModel.find({ 
    "slug" : req.params.cat 
} ,function(err, categories){ 
    if (err) throw err; 

    res.send(categories); 
})}); 

您可以使用聚合框架。您可以获得详细信息herehere

此代码将正常工作。

MyModel.aggregate([ 
 
    { 
 
     "$match": { 
 
      "subCats.subCats.slug": req.params.cat 
 
     } 
 
    }, 
 
    { "$unwind": "$subCats" }, 
 
    { "$unwind": "$subCats.subCats" }, 
 
    { 
 
     "$match": { 
 
      "subCats.subCats.slug": req.params.cat 
 
     } 
 
    }, 
 
    { 
 
     "$project": { 
 
      "data":"$subCats.subCats" 
 
     } 
 
    } 
 
], function (err, result) { 
 
    console.log(result); 
 
})

在这里,我们第一个匹配的文件通过$匹配和退绕subCats两次后,以减少其他unnessary文件,我们再次匹配参数,最后我们只返回肠子subCats文件。

+0

这会给他所有在'subCats.subCats.slug'中的'Apple'中的文档,以及太整个文档,OP要获取'sub-category'类别'其中'slug:苹果' –

+0

@RaviShankar谢谢我更新了答案。 – Tolsee