首页 > 解决方案 > 在 MongoDB 中查询嵌套数组

问题描述

需要帮助格式化查询以使用嵌套数组的搜索参数查找/获取值。

我有一个集合如下

[
    {
        "_id": "5b3ad55f66479332a0482961",
        "timestamp": "2018-06-17T00:30:00.000Z",
        "deviceid": "123456",
        "values": [
            {
                "minval": 1,
                "minvalues": [
                    {
                        "secval": 51,
                        "secvalues": {                            
                            "alt": "300",
                            "mcc": "404",
                            "mnc": "46",
                            "priority": 1
                        }
                    },
                    {
                        "secval": 52,
                        "secvalues": {                            
                            "alt": "300",
                            "mcc": "404",
                            "mnc": "46",
                            "priority": 1
                        }
                    },                                        
                    {
                        "secval": 56,
                        "secvalues": {
                            "alt": "300",
                            "mcc": "404",
                            "mnc": "46",
                            "priority": 0
                        }
                    }
                ]
            }
        ]
    }
]

需要如下输出,搜索属性为“values.minvalues.secvalues.priority”

[
    {
        "_id": "5b3ad55f66479332a0482961",
        "timestamp": "2018-06-17T00:30:00.000Z",
        "deviceid": "123456",
        "values": [
            {
                "minval": 1,
                "minvalues": [                    
                    {
                        "secval": 56,
                        "secvalues": {
                            "alt": "300",
                            "mcc": "404",
                            "mnc": "46",
                            "priority": 0
                        }
                    }
                ]
            }
        ]
    }
]

我尝试了以下查询但没有成功

dbRetval.db('ls_gpsdatabase').collection('gpsevent').aggregate([
            { "$match": { "deviceid": { "$in": idList}}},
            { "$sort": { "_id": -1} },
            {"$unwind":"$values.minvalues.secvalues"},
            //{"$project":{"deviceid":1,"values.minvalues.secvalues.lat":1,"values.minvalues.secvalues.min":1}} ,
            { "$match": { "values.minvalues.secvalues.priority": { "$eq": 1}}},
            { "$group": { "_id": "$deviceid" , "doc": { "$push": "$values.minvalues.secvalues" }}} ]).toArray();

如果有任何帮助,那将是非常充分的。

标签: mongodb

解决方案


您可以使用$addFields替换现有字段。由于您有两个级别的嵌套数组,您可以使用$map for external 和$filter for inner 检查您的条件:

db.col.aggregate([
    {
        $match: { 
           "_id": "5b3ad55f66479332a0482961",
           "timestamp": "2018-06-17T00:30:00.000Z"
        } 
    },
    {
        $addFields: {
            values: {
                $map: {
                    input: "$values",
                    as: "value",
                    in: {
                        minval: "$$value.minval",
                        minvalues: {
                            $filter: {
                                input: "$$value.minvalues",
                                as: "minvalue",
                                cond: {
                                    $eq: [ "$$minvalue.secvalues.priority", 0 ]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
])

推荐阅读