【问题标题】:How to select deep nested data in mongodb using mongoose in nodejs如何在nodejs中使用mongoose在mongodb中选择深层嵌套数据
【发布时间】:2017-09-05 18:56:39
【问题描述】:

我是 nodejs 和 mongoose 的新手,我创建了一个类别文档,其中包含类别和子类别,子类别甚至还有子类别。现在我想从第 3 级中选择值,但我无法获得成功。

这是我的类别的样子

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

在这里我想获取 Apple 类别的 _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);
})});

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您可以使用聚合框架。您可以在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);
    })

    这里我们首先匹配文档以将其他不需要的文档减少$match,并且在展开subCats两次后,我们再次匹配参数,最后我们只返回了innner subCats文档。

    【讨论】:

    • 这将为他提供subCats.subCats.slug中'Apple'中的所有文档,以及整个文档,OP想要的是获取sub-category中唯一的sub-category其中slug:apple
    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多