MongoDB обновляет вложенные объекты в массиве - PullRequest
0 голосов
/ 21 марта 2020

Я застрял в этом вопросе с трех дней. Мне нужно обновить вложенные объекты в массиве. Чтобы сделать его более сложным, мой Array сам вложен в объект, где ключ должен создаваться динамически, когда пользователь добавляет больше категорий. Я застрял с двумя проблемами:

  1. Как динамически создавать категории в запросах? (Передача значения по ссылке вызывает синтаксическую ошибку)
  2. Как обновить спецификацию c Элемент массива на основе некоторых фильтров

Мой документ в Mongodb, который необходимо обновить. Ключи объекта inte rnet и электричество должны создаваться динамически

Для проблемы AI прибегли к жесткому коду категории и перешли на

    switch (category) {
                case 'internet':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.internet": newBill}});
                    break;
                case 'electricity':
                    qry = User.findOneAndUpdate({username: obj.username,}, {$push: {"data.electricity": newBill}});
                    break;
                case 'water':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.water": newBill}});
                    break;
                case 'gas':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.gas": newBill}});
                    break;
                default:

                    break;
            }

После создания категории я не хочу, чтобы объекты дублировались внутри, поэтому я использую DAY & Year в качестве идентификатора, чтобы соответствовать намерению перезаписать, если вставлено повторяющееся значение. Я пробовал несколько способов обновления, но ни один не работает. Пожалуйста, совет, эксперт mongoDb нуждался в


console.log("duplicate qry")
            switch (category) {
                case 'internet':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.internet": newBill,$position: index}});
                    break;
                case 'electricity':
                    qry = User.updateOne({username: obj.username, month:newBill.month, year:newBill.year}, {$set: {"data.electricity.$": newBill}});
                    console.log("Inside db case "+index)
                    break;
                case 'water':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.water": newBill,$position: index}});
                    break;
                case 'gas':
                    qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.gas": newBill,$position: index}});
                    break;
                default:

                    break;
            }
        }




Мой обработчик использовал два запроса для поиска и обновления, если не было дублированного объекта. Если он присутствует, он возвращает индекс дублированного объекта, который я могу использовать для моего второго qry

//insert & update data
app.post('/update', function (req, res) {
    let obj = req.body
    let category = obj.category
    let insertObj = obj.data
    let flag = false;
    let index = 0;
    db.getUserDoc(req.body).then(function (data) {
        // console.log(data.doc)
        let keys = Object.keys(data.doc)
        console.log(`${category}`)
        if (keys.includes(`${category}`)) {
            let catObj = data.doc[`${category}`]
            let nestedKeys = Object.keys(catObj);
            let nestedVals = Object.values(catObj)
            for (let i = 0; i < catObj.length; i++) {
                if (catObj[i].month === insertObj.month && catObj[i].year === insertObj.year) {
                    console.log("not unique " + i)
                    flag = true;
                    index = i;
                    console.log(catObj.length);
                }
            }
            // console.log(insertObj.month + " "+ insertObj.year)
            console.log(catObj.length);
        }
        db.update(req.body, obj.data, obj.category, flag, index).then(function (data) {
            // res.setHeader('Content-Type', 'text/plain');
            // res.end(data)
            console.log(data);
            res.end(JSON.stringify(200));
        }).catch(function (e) {
            return res.status(500, {
                error: e
            })
        });

        // console.log(typeof data)
        // console.log(data);
        // res.end(JSON.stringify(data.doc));
    })


})



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...