Запрос MongoDB для вложенных массивов - PullRequest
0 голосов
/ 03 июля 2018

Требуется помощь для форматирования запроса для поиска / получения значений с использованием параметров поиска с вложенным массивом.

У меня есть следующая коллекция

[
    {
        "_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();

Если кто-то может помочь, это было бы здорово.

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете использовать $ addFields для замены существующего поля. Поскольку у вас есть два уровня вложенных массивов, вы можете использовать $ map для внешнего и $ filter для внутреннего, чтобы проверить ваше состояние:

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 ]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...