Упростите оператор forEach для обновления документа mongoDB вложенными объектами и массивами - PullRequest
0 голосов
/ 11 февраля 2019

Я бы хотел обновить значение ключа shouldSendAlert в следующем документе:

{
    "_id" : ObjectId("5c61c4db46d18e1092c5b024"),
    "service" : "SRVPVD",
    "menu" : [ 
        {
            "sub" : [ 
                {
                    "options" : [ 
                        {
                            "item" : [ 
                                {
                                    "name" : "",
                                    "actions" : [ 
                                        {
                                            "name" : "communicateClient",
                                            "value" : true
                                        }, 
                                        {
                                            "name" : "shouldSendAlert",
                                            "value" : false
                                        }
                                    ]
                                }
                            ],
                            "name" : "Technology Support"
                        }, 
                        {
                            "item" : [ 
                                {
                                    "name" : "",
                                    "actions" : [ 
                                        {
                                            "name" : "communicateClient",
                                            "value" : true
                                        }
                                    ]
                                }
                            ],
                            "name" : "Company Support"
                        }
                    ],
                    "name" : "Support"
                }, 
                {
                    "name" : " FAQ"
                }
            ],
            "name" : "Help"
        }
    ]
}

Мне удалось это сделать, запросив документ с помощью множественного запроса $elemMatch,и использование forEach для запуска через вложенные массивы с целью изменения значения shouldSendAlert:

{
    let menuItems = db.getCollection('menumodels').find({menu: {$elemMatch: {name: 'Help',sub: {$elemMatch: {name: 'Support',motivos: {$elemMatch: {name: 'Technology Support'}}}}}}});

    menuItems.forEach((r) => {
        r.menu.forEach(menuItem => {
            if (menuItem.name == 'Help') {
                menuItem.sub.forEach(sub => {
                    if (sub.name == 'Support') {
                        sub.motivos.forEach(motivo => {
                            if (motivo.name == "Technology Support") {
                                motivo.item[0].actions.forEach(action => {
                                    if (action.name == 'shouldSendAlert') {
                                        action.value = true;
                                        db.getCollection('menumodels').update({_id: r._id}, {$set: {menu: r.menu}})
                                    }
                                })
                            }
                        })
                    }
                })
            }
        })
    });
}

Нужно ли - в отношении производительности - кодировать этот запрос MongoDB или обновлять логику до более разумногоформе?Влияет ли многократное использование $elemMatch на производительность?

...