查找嵌套数组mongodb

时间:2015-04-14 15:29:13

标签: node.js mongodb api nested

所以我有一个mongodb文件看起来像这样:

[
    {
        "_id": "04",
        "name": "test service 4",
        "id": "04",
        "version": "0.0.1",
        "title": "testing",
        "description": "test",
        "protocol": "test",
        "operations": [
            {
                "_id": "99",
                "oName": "test op 52222222222",
                "sid": "04",
                "name": "test op 52222222222",
                "oid": "99",
                "description": "testing",
                "returntype": "test",
                "parameters": [
                    {
                        "oName": "Param1",
                        "name": "Param1",
                        "pid": "011",
                        "type": "582",
                        "description": "testing",
                        "value": ""
                    },
                    {
                        "oName": "Param2",
                        "name": "Param2",
                        "pid": "012",
                        "type": "58222",
                        "description": "testing",
                        "value": ""
                    }
                ]
            }
        ]
    }
]

我希望能够找到所有参数和个人参数但我不完全确定如果我使用它:

 collection.find({operations: {$elemMatch: {oid: oid}}}, {"operations.$.parameters": 1}).toArray(function(error, result) {
    if (error) {
        console.log('Error retrieving parameter: ' + error);
        res.send({'error':'An error has occurred'});
    } else {
        // console.log(result);
        res.send(result);
    }
});

我得到的输出是:

[
    {
        "_id": "04",
        "operations": [
            {
                "_id": "99",
                "oName": "test op 52222222222",
                "sid": "04",
                "name": "test op 52222222222",
                "oid": "99",
                "description": "testing",
                "returntype": "test",
                "parameters": [
                    {
                        "oName": "Param1",
                        "name": "Param1",
                        "pid": "011",
                        "type": "582",
                        "description": "testing",
                        "value": ""
                    }
                ]
            }
        ]
    }
]

尽管我唯一想要的是个人参数。我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您可以使用aggregation framework

var oid = "99",
    pipeline = [
    {
        $match: {
            "operations.oid": oid
        }
    },
    {
        $unwind: "$operations"
    },
    {
        $match: {
            "operations.oid": oid
        }
    },
    {
        $unwind: "$operations.parameters"
    },
    {
        $project: {            
            "parameters": "$operations.parameters"
        }
    }
];

collection.aggregate(pipeline).toArray(function(error, result) {
    if (error) {
        console.log('Error retrieving parameter: ' + error);
        res.send({'error':'An error has occurred'});
    } else {
        // console.log(result);
        res.send(result);
    }
});

<强>输出

    [ 
        {
            "_id" : "04",
            "parameters" : {
                "oName" : "Param1",
                "name" : "Param1",
                "pid" : "011",
                "type" : "582",
                "description" : "testing",
                "value" : ""
            }
        }, 
        {
            "_id" : "04",
            "parameters" : {
                "oName" : "Param2",
                "name" : "Param2",
                "pid" : "012",
                "type" : "58222",
                "description" : "testing",
                "value" : ""
            }
        }
    ]

修改

要访问给定pid值的单个参数,您可以通过在$match$unwind阶段之间添加$project管道阶段来修改管道,以便您可以过滤文档以返回与pid匹配的参数对象:

var oid = "99", 
    pid = "011",
    pipeline = [
        {
            $match: {
                "operations.oid": oid
            }
        },
        {
            $unwind: "$operations"
        },
        {
            $match: {
                "operations.oid": oid
            }
        },
        {
            $unwind: "$operations.parameters"
        },
        // This pipeline stage returns the individual parameters object that matches the given pid value
        {
            $match: { "operations.parameters.pid": pid }
        },
        {
            $project: {            
                "parameters": "$operations.parameters"
            }
        }
    ];

<强>输出

[ 
    {
        "_id" : "04",
        "parameters" : {
            "oName" : "Param1",
            "name" : "Param1",
            "pid" : "011",
            "type" : "582",
            "description" : "testing",
            "value" : ""
        }
    }
]